智能车学习日记(七)PWM_demo
PWM波用于舵机转动
zf_gtm_pwm.c
pwm初始化: gtm_pwm_init(ATOM0_CH7_P02_7, 50, 1000);可以设置频率和初占空比
void gtm_pwm_init(ATOM_PIN_enum pwmch, uint32 freq, uint32 duty) { IfxGtm_Atom_Pwm_Config g_atomConfig; IfxGtm_Atom_Pwm_Driver g_atomDriver; IfxGtm_Atom_ToutMap *atom_channel; atom_channel = gtm_atom_mux(pwmch); switch(atom_channel->atom) { case 0: IFX_ASSERT(IFX_VERBOSE_LEVEL_ERROR, duty <= GTM_ATOM0_PWM_DUTY_MAX); break; case 1: IFX_ASSERT(IFX_VERBOSE_LEVEL_ERROR, duty <= GTM_ATOM1_PWM_DUTY_MAX); break; case 2: IFX_ASSERT(IFX_VERBOSE_LEVEL_ERROR, duty <= GTM_ATOM2_PWM_DUTY_MAX); break; case 3: IFX_ASSERT(IFX_VERBOSE_LEVEL_ERROR, duty <= GTM_ATOM3_PWM_DUTY_MAX); break; } IfxGtm_enable(&MODULE_GTM); if(!(MODULE_GTM.CMU.CLK_EN.U & 0x2)) { IfxGtm_Cmu_setClkFrequency(&MODULE_GTM, IfxGtm_Cmu_Clk_0, CMU_CLK_FREQ); IfxGtm_Cmu_enableClocks(&MODULE_GTM, IFXGTM_CMU_CLKEN_CLK0); } IfxGtm_Atom_Pwm_initConfig(&g_atomConfig, &MODULE_GTM); g_atomConfig.atom = atom_channel->atom; g_atomConfig.atomChannel = atom_channel->channel; g_atomConfig.period = CMU_CLK_FREQ/freq; g_atomConfig.pin.outputPin = atom_channel; g_atomConfig.synchronousUpdateEnabled = TRUE; switch(atom_channel->atom) { case 0: g_atomConfig.dutyCycle = (uint32)((uint64)duty * g_atomConfig.period / GTM_ATOM0_PWM_DUTY_MAX); break; case 1: g_atomConfig.dutyCycle = (uint32)((uint64)duty * g_atomConfig.period / GTM_ATOM1_PWM_DUTY_MAX); break; case 2: g_atomConfig.dutyCycle = (uint32)((uint64)duty * g_atomConfig.period / GTM_ATOM2_PWM_DUTY_MAX); break; case 3: g_atomConfig.dutyCycle = (uint32)((uint64)duty * g_atomConfig.period / GTM_ATOM3_PWM_DUTY_MAX); break; } IfxGtm_Atom_Pwm_init(&g_atomDriver, &g_atomConfig); IfxGtm_Atom_Pwm_start(&g_atomDriver, TRUE); }
pwm占空比设置 pwm_duty(ATOM0_CH7_P02_7, 5000);
void pwm_duty(ATOM_PIN_enum pwmch, uint32 duty) { uint32 period; IfxGtm_Atom_ToutMap *atom_channel; atom_channel = gtm_atom_mux(pwmch); period = IfxGtm_Atom_Ch_getCompareZero(&MODULE_GTM.ATOM[atom_channel->atom], atom_channel->channel); switch(atom_channel->atom) { case 0: duty = (uint32)((uint64)duty * period / GTM_ATOM0_PWM_DUTY_MAX); break; case 1: duty = (uint32)((uint64)duty * period / GTM_ATOM1_PWM_DUTY_MAX); break; case 2: duty = (uint32)((uint64)duty * period / GTM_ATOM2_PWM_DUTY_MAX); break; case 3: duty = (uint32)((uint64)duty * period / GTM_ATOM3_PWM_DUTY_MAX); break; } IfxGtm_Atom_Ch_setCompareOneShadow(&MODULE_GTM.ATOM[atom_channel->atom], atom_channel->channel, duty); }
主函数
int core0_main(void) { disableInterrupts(); get_clk();//获取时钟频率 务必保留 //用户在此处调用各种初始化函数等 gtm_pwm_init(ATOM0_CH4_P02_4, 50, 0);//ATOM 0模块的通道4 使用P02_4引脚输出PWM PWM频率50HZ 占空比百分之0/GTM_ATOM0_PWM_DUTY_MAX*100 GTM_ATOM0_PWM_DUTY_MAX宏定义在zf_gtm_pwm.h gtm_pwm_init(ATOM0_CH5_P02_5, 1000, 0); gtm_pwm_init(ATOM0_CH6_P02_6, 10000, 0); gtm_pwm_init(ATOM0_CH7_P02_7, 30000, 0); gtm_pwm_init(ATOM1_CH7_P00_8, 30000, 5000); //每个通道都可以输出不同频率的PWM pwm_duty(ATOM0_CH4_P02_4, 5000);//设置占空比为百分之5000/GTM_ATOM0_PWM_DUTY_MAX*100 pwm_duty(ATOM0_CH5_P02_5, 5000); pwm_duty(ATOM0_CH6_P02_6, 5000); pwm_duty(ATOM0_CH7_P02_7, 5000); enableInterrupts(); while (TRUE) { } }
每个通道可以输出不同频率的pwm波
对于3010模拟舵机频率50hz
SD-5数字舵机频率300hz
函数中的占空比5000就是50%
占空比为750:回正 1250:舵机转到最大角度 250:最小角度 可以在zf_gtm_pwm.h文件中设置占空比最大值
可以定义全局变量duty控制pwm占空比
推荐的舵机引脚是ATOM0_CH1_P33_9