⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pwm.c

📁 这是一个uC/OS的系统驱动程序
💻 C
字号:
#include <includes.h>


/* ------------------PWM驱动直流电机相关定义-------------------*/
void PwmInitLize();                                             //  PWM初始化
void PwmRelease();                                              //  清除PWM初始化配置
void MotorClockwise(int period, int duty);                      //  顺时针转动直流电机
void MotorAnticlockwise(int period, int duty);                  //  逆时针转动直流电机
void MotorStop(int period, int duty);                           //  停转直流电机
void MotorChangeSpeed(int duty);                                //  改变直流电机的转速


void Delay(unsigned long lDelayNum){ while(lDelayNum--); }

void  TaskPwm(void *p_arg)
{
  while(1)
  {
    //  初始化PWM
    PwmInitLize();

    //* 开始直流电机测试
    //  1.直流电机顺时针转动测试:顺时针转动;转速由慢到快,再由快到慢;最后停止转动
    MotorClockwise(PWM_PERIOD_VALUE, PWM_DUTY_SLOW);
    OSTimeDlyHMSM(0, 0, 5, 0);
    MotorChangeSpeed(PWM_DUTY_NOMAL);
    OSTimeDlyHMSM(0, 0, 5, 0);
    MotorChangeSpeed(PWM_DUTY_HURRY);
    OSTimeDlyHMSM(0, 0, 5, 0);
    MotorChangeSpeed(PWM_DUTY_NOMAL);
    OSTimeDlyHMSM(0, 0, 5, 0);
    MotorChangeSpeed(PWM_DUTY_SLOW);
    OSTimeDlyHMSM(0, 0, 5, 0);
    MotorStop(PWM_PERIOD_VALUE, PWM_DUTY_SLOW);
    OSTimeDlyHMSM(0, 0, 2, 0);

    //  2.直流电机逆时针转动测试:逆时针转动;转速由慢到快,再由快到慢;最后停止转动
    MotorAnticlockwise(PWM_PERIOD_VALUE, PWM_DUTY_SLOW);
    OSTimeDlyHMSM(0, 0, 5, 0);
    MotorChangeSpeed(PWM_DUTY_NOMAL);
    OSTimeDlyHMSM(0, 0, 5, 0);
    MotorChangeSpeed(PWM_DUTY_HURRY);
    OSTimeDlyHMSM(0, 0, 5, 0);
    MotorChangeSpeed(PWM_DUTY_NOMAL);
    OSTimeDlyHMSM(0, 0, 5, 0);
    MotorChangeSpeed(PWM_DUTY_SLOW);
    OSTimeDlyHMSM(0, 0, 5, 0);
    MotorStop(PWM_PERIOD_VALUE, PWM_DUTY_SLOW);

    PwmRelease();

    OSTimeDlyHMSM(0, 0, 5, 0);
  }

}


void PwmInitLize()
{
  //  使能PMC的pwmc时钟
  AT91F_PWMC_CfgPMC();

  //  分配PWM0由PA0输出PWM
  AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA, AT91C_PA0_PWM0, 0);
  //  分配PWM1由PA1输出PWM
  AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA, AT91C_PA1_PWM1, 0);
}

void PwmRelease()
{

}

/*
  函数说明:  顺时针转动直流电机
  参数说明:  int period --  PWM周期
             int duty   --  PWM占空比
  备    注:  配置PWM0低电平启动,PWM1高电平启动;占空比相同,即PWM0,PWM1波型相反;
            可参见PWM直流电机驱动电路理解
*/
void MotorClockwise(int period, int duty)
{
  //  暂停PWM0,PWM1通道
  AT91F_PWMC_StopChannel(AT91C_BASE_PWMC,AT91C_PWMC_CHID0|AT91C_PWMC_CHID1);

  //  配置PWM0,PWM1通道: <在下个周期开始时更新占空比>+<输出波形在低电平启动>+<周期左对齐>+<通道时钟为MCK>
  //  配置PWM0低电平启动,PWM1高电平启动;占空比相同,即PWM0,PWM1波型相反
  AT91F_PWMC_CfgChannel(AT91C_BASE_PWMC, PWM0, (PWM_CPD_DUTY | PWM_CPOL_LOW  | PWM_CALG_LEFT | PWM_CPRE_MCK), period, duty);
  AT91F_PWMC_CfgChannel(AT91C_BASE_PWMC, PWM1, (PWM_CPD_DUTY | PWM_CPOL_HIGH | PWM_CALG_LEFT | PWM_CPRE_MCK), period, duty);

  OSTimeDlyHMSM(0, 0, 1, 0);
  //  使能PWM0,PWM1
  AT91F_PWMC_StartChannel(AT91C_BASE_PWMC,AT91C_PWMC_CHID0|AT91C_PWMC_CHID1);
}

/*
  函数说明:  逆时针转动直流电机
  参数说明:  int period --  PWM周期
             int duty   --  PWM占空比
  备    注:  配置PWM0高电平启动,PWM1低电平启动;占空比相同,即PWM0,PWM1波型相反;
            可参见PWM直流电机驱动电路理解
*/
void MotorAnticlockwise(int period, int duty)
{
  //  暂停PWM0,PWM1通道
  AT91F_PWMC_StopChannel(AT91C_BASE_PWMC,AT91C_PWMC_CHID0|AT91C_PWMC_CHID1);

  //  配置PWM0,PWM1通道: <在下个周期开始时更新占空比>+<输出波形在低电平启动>+<周期左对齐>+<通道时钟为MCK>
  //  配置PWM0高电平启动,PWM1低电平启动;占空比相同,即PWM0,PWM1波型相反
  AT91F_PWMC_CfgChannel(AT91C_BASE_PWMC, PWM0, (PWM_CPD_DUTY | PWM_CPOL_HIGH  | PWM_CALG_LEFT | PWM_CPRE_MCK), period, duty);
  AT91F_PWMC_CfgChannel(AT91C_BASE_PWMC, PWM1, (PWM_CPD_DUTY | PWM_CPOL_LOW   | PWM_CALG_LEFT | PWM_CPRE_MCK), period, duty);

  OSTimeDlyHMSM(0, 0, 1, 0);
  //  使能PWM0,PWM1
  AT91F_PWMC_StartChannel(AT91C_BASE_PWMC,AT91C_PWMC_CHID0|AT91C_PWMC_CHID1);
}

/*
  函数说明:  停止转动直流电机
  参数说明:  int duty -- PWM占空比
  备    注:  配置两通路的PWM脉冲波型一致,使得电机两端无电压差,即停转
*/
void MotorStop(int period, int duty)
{
  //  暂停PWM0,PWM1通道
  AT91F_PWMC_StopChannel(AT91C_BASE_PWMC,AT91C_PWMC_CHID0|AT91C_PWMC_CHID1);

  //  配置PWM0,PWM1通道: <在下个周期开始时更新占空比>+<输出波形在低电平启动>+<周期左对齐>+<通道时钟为MCK>
  //  配置两通路的PWM脉冲波型一致,使得电机两端无电压差,即停转
  AT91F_PWMC_CfgChannel(AT91C_BASE_PWMC, PWM0, (PWM_CPD_DUTY | PWM_CPOL_LOW  | PWM_CALG_LEFT | PWM_CPRE_MCK), period, duty);
  AT91F_PWMC_CfgChannel(AT91C_BASE_PWMC, PWM1, (PWM_CPD_DUTY | PWM_CPOL_LOW | PWM_CALG_LEFT | PWM_CPRE_MCK), period, duty);
  OSTimeDlyHMSM(0, 0, 1, 0);

  //  使能PWM0,PWM1
  AT91F_PWMC_StartChannel(AT91C_BASE_PWMC,AT91C_PWMC_CHID0|AT91C_PWMC_CHID1);
}
/*
  函数说明:更改电机的速度:
  参数说明:int duty -- PWM占空比
  备    注:相对增大PWM占空比,将会提高电机的转速;减小PWM占空比,将会降低电机的转速;
*/
void MotorChangeSpeed(int duty)
{
  AT91F_PWMC_UpdateChannel(AT91C_BASE_PWMC, PWM0, duty);
  AT91F_PWMC_UpdateChannel(AT91C_BASE_PWMC, PWM1, duty);
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -