📄 pwm.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 + -