TA的每日心情 | 开心 2019-6-20 14:08 |
---|
签到天数: 43 天 连续签到: 1 天 [LV.5]常住居民I
|
为了完成这个实验,让我花了近1周半的时间才算搞定,尤其在世界杯期间,备受无法看球的痛苦和实验没有结果的折磨,令我非常备受打击!还好在我快要放弃的时候,总算让我搞定了,非常高兴!闲话少说,直来干货吧!
1. 硬件支持的论证 一般的开发板都会将具有PWM功能的引脚与LED灯所连接,更不用说RGB灯了,用3个具有PWM功能的引脚驱动RGB灯,可以用来实现彩灯/呼吸灯效果。通过查看野火miniRT1052的原理图,可以知道连接RGB的三个引脚分别为IOMUXC_GPIO_AD_B1_08_GPIO1_IO24(开发板CN4插件上的30引脚)、IOMUXC_GPIO_AD_B1_09_GPIO1_IO25(开发板CN4插件上的35引脚)和IOMUXC_GPIO_AD_B1_10_GPIO1_IO10(开发板CN4插件上的4引脚)。我们可以在fsl_iomuxc.h文件中查到这三个引脚具有的功能组。以IOMUXC_GPIO_AD_B1_08_GPIO1_IO24为例,如下图所示。
,由该组引脚说明,可以发现红色标识的该引脚可以复用flexpwm功能(其实也就是pwm功能,查看参考手册可以知道有4个FLEXPWM部件,而每个部件有4个子模块,每一个子模块又可以互补输出A和B通道,瞬时间感觉高大上,进行电机驱动/读取编码器绰绰有余 ),而其他2个引脚也一样,所以由此可以得出结论:RGB灯可以通过PWM1的3通道A、PWM4的0通道A和1通道A来实现呼吸灯/彩灯功能(这个其实在用GPIO方式时,也可以实现,只是那个方法比较low了,需要各种色彩进行枚举了)。
2. 软件的实现 因为野火的没有提供相关的资料,所以我就以固件库里面pwm的例子来学习,经过分析源码学习后,尝试修改,结果老是失败,上野火论坛咨询,帖子也石沉大海了!最后,总算功夫不负有心人,参考原子哥的例子,总算修改好了,修改步骤如下。
(1) 需要添加对pwm的fault设定(我也不知道为什么,固件库例子也是这么给出的,参考手册也没有看出来个所以然)
XBARA1_Signal_Set(kXBARA1_InputLogicHigh,kXBARA1_OutputFlexpwm1Fault0); XBARA1_Signal_Set(kXBARA1_InputLogicHigh,kXBARA1_OutputFlexpwm1Fault1); XBARA1_Signal_Set(kXBARA1_InputLogicHigh,kXBARA1_OutputFlexpwm4Fault0); //这句是根据需要操作PWM4而添加的XBARA1_Signal_Set(kXBARA1_InputLogicHigh,kXBARA1_OutputFlexpwm4Fault1); //这句是根据需要操作PWM4而添加的 XBARA1_Signal_Set(kXBARA1_InputLogicHigh,kXBARA1_OutputFlexpwm1234Fault2); XBARA1_Signal_Set(kXBARA1_InputLogicHigh,kXBARA1_OutputFlexpwm1234Fault3); (2)对引脚进行初始化
//IO引脚设置 IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_08_FLEXPWM4_PWMA00,0); IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_09_FLEXPWM4_PWMA01,0); IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_10_FLEXPWM1_PWMA03,0); //功能设置 IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B1_08_FLEXPWM4_PWMA00,0x10B0); IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B1_09_FLEXPWM4_PWMA01,0x10B0); IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_10_FLEXPWM1_PWMA03,0x10B0);(3)PWM功能设置PWM_GetDefaultConfig(&pwmXsmX_config); //先初始化为默认值pwmXsmX_config.clockSource=kPWM_BusClock; //时钟源IP BUS=IPG_CLK_ROOT=150MHzpwmXsmX_config.prescale=pwm_prescale; //分频值pwmXsmX_config.reloadLogic=kPWM_ReloadPwmFullCycle; //全周期更新pwmXsmX_config.pairOperation=kPWM_Independent; //PMWA PWMB独立模式(固件库中有PWMA和PWMB互补输出方式的实现方式)(4)初始化PWM通道
PWM_Init(PWM4,kPWM_Module_0 | kPWM_Module_1,&pwmXsmX_config)WM_Init(PWM1,kPWM_Module_3,&pwmXsmX_config);sourceclock=CLOCK_GetFreq(kCLOCK_IpgClk); //PWMApwm_ignal.pwmChannel=kPWM_PwmA; //通道Apwm_ignal.level=kPWM_HighTrue; //高电平有效pwm_ignal.dutyCyclePercent=duty; //占空比PWM_SetupPwm(PWM4,kPWM_Module_0,&pwm_ignal,1,kPWM_SignedCenterAligned,fre,sourceclock)WM_SetPwmLdok(PWM4,kPWM_Control_Module_0,true); //设置PWM的load ok位PWM_StartTimer(PWM4,kPWM_Control_Module_0); //启动定时器 PWM_SetupPwm(PWM4,kPWM_Module_1,&pwm_ignal,1,kPWM_SignedCenterAligned,fre,sourceclock)WM_SetPwmLdok(PWM4,kPWM_Control_Module_1,true); PWM_StartTimer(PWM4,kPWM_Control_Module_1); //启动定时器<br>WM_SetupPwm(PWM1,kPWM_Module_3,&pwm_ignal,1,kPWM_SignedCenterAligned,fre,sourceclock)WM_SetPwmLdok(PWM1,kPWM_Control_Module_3,true); PWM_StartTimer(PWM1,kPWM_Control_Module_3); //启动定时器(5)根据自己的需要更改占空比
PWM_UpdatePwmDutycycle(PWM4,kPWM_Module_0,kPWM_PwmA,kPWM_SignedCenterAligned,duty); // 更新PWM4 0路的A通道 占空比PWM_SetPwmLdok(PWM4,kPWM_Control_Module_0,true); //设置PWM的load ok位<br>WM_UpdatePwmDutycycle(PWM4,kPWM_Module_1,kPWM_PwmA,kPWM_SignedCenterAligned,duty); // 更新PWM4 1路的A通道 占空比PWM_SetPwmLdok(PWM4,kPWM_Control_Module_1,true); //设置PWM的load ok位PWM_UpdatePwmDutycycle(PWM1,kPWM_Module_3,kPWM_PwmA,kPWM_SignedCenterAligned,duty); // 更新PWM1 3路的A通道 占空比PWM_SetPwmLdok(PWM1,kPWM_Control_Module_3,true); //设置PWM的load ok位3. 通过示波器可以分别检查到3个引脚的输出正常,效果视频如下(分别为变化慢和变化快)。https://v.youku.com/v_show/id_XMzY4MDcyOTk1Ng==.ht...
https://v.youku.com/v_show/id_XMzY4MDcyOTk2MA==.ht... |
|