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