智能车学习日记(七)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

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值