[活动] 【多旋翼飞控】通过FTM进行PWM波输出和脉冲捕获

[复制链接]
3121|0
 楼主| 冷不丁 发表于 2016-2-6 15:58 | 显示全部楼层 |阅读模式
不同于STM32使用有PWM和定时器中断,可以分别用于PWM输出和脉冲捕获。
K64还有很多其他NXP M4系列的芯片都具有PWM输出和脉冲捕获的模块FTM。
FTM功能很强大,基本功能PWM、输入捕获、正交解码。
这次多旋翼飞控,使用FTM输入捕获来获取接收机的遥控信号。
FTM PWM输出来控制无刷电机转数。
分享一下我学习FTM用到的资料:



FTM PWM输出的设置

  1. #define MOTO_FTM_BASE                  FTM3
  2. #define MOTO_FTM_INSTANCE              3
  3. #define MOTO_FTM_PERIOD_HZ             50
  4. #define MOTO_0_CHANNEL             0
  5. #define MOTO_1_CHANNEL             1
  6. #define MOTO_2_CHANNEL             2
  7. #define MOTO_3_CHANNEL             3

  8. extern ftm_pwm_param_t MotoParam;
  9. extern ftm_user_config_t ftmInfo;

  10. void PWM_Init(void);
  11. void PWMPulseWidthSet(uint32_t instance, uint32_t Width, uint8_t channel);
  1.       PORT_HAL_SetDriveStrengthMode(PORTD,0u,kPortLowDriveStrength);  
  2.       PORT_HAL_SetMuxMode(PORTD,0u,kPortMuxAlt4);
  3.       PORT_HAL_SetSlewRateMode(PORTD,0u,kPortSlowSlewRate);
  4.        
  5.           PORT_HAL_SetDriveStrengthMode(PORTD,1u,kPortLowDriveStrength);  
  6.       PORT_HAL_SetMuxMode(PORTD,1u,kPortMuxAlt4);
  7.       PORT_HAL_SetSlewRateMode(PORTD,1u,kPortSlowSlewRate);
  8.        
  9.           PORT_HAL_SetDriveStrengthMode(PORTD,2u,kPortLowDriveStrength);  
  10.       PORT_HAL_SetMuxMode(PORTD,2u,kPortMuxAlt4);
  11.       PORT_HAL_SetSlewRateMode(PORTD,2u,kPortSlowSlewRate);
  12.        
  13.           PORT_HAL_SetDriveStrengthMode(PORTD,3u,kPortLowDriveStrength);  
  14.       PORT_HAL_SetMuxMode(PORTD,3u,kPortMuxAlt4);
  15.       PORT_HAL_SetSlewRateMode(PORTD,3u,kPortSlowSlewRate);
  1. ftm_pwm_param_t MotoParam = {
  2.         .mode                   = kFtmEdgeAlignedPWM,
  3.         .edgeMode               = kFtmHighTrue,
  4.         .uFrequencyHZ           = 50u,
  5.         .uDutyCyclePercent      = 1250,
  6.         .uFirstEdgeDelayPercent = 0,
  7. };
  8. ftm_user_config_t ftmInfo;

  9. void PWM_Init(void)
  10. {
  11.     // Initialize FTM module,
  12.     // configure for software trigger.zsaA
  13.     memset(&ftmInfo, 0, sizeof(ftmInfo));
  14.     ftmInfo.syncMethod = kFtmUseSoftwareTrig;
  15.     FTM_DRV_Init(MOTO_FTM_INSTANCE, &ftmInfo);
  16.     FTM_DRV_SetClock(MOTO_FTM_INSTANCE, kClock_source_FTM_SystemClk, kFtmDividedBy64);
  17.         PWMPulseWidthSet(MOTO_FTM_INSTANCE, 1250, MOTO_0_CHANNEL);
  18.         PWMPulseWidthSet(MOTO_FTM_INSTANCE, 1250, MOTO_1_CHANNEL);
  19.         PWMPulseWidthSet(MOTO_FTM_INSTANCE, 1250, MOTO_2_CHANNEL);
  20.         PWMPulseWidthSet(MOTO_FTM_INSTANCE, 1250, MOTO_3_CHANNEL);
  21. }

  22. void PWMPulseWidthSet(uint32_t instance, uint32_t Width, uint8_t channel)
  23. {
  24.                 MotoParam.uDutyCyclePercent=Width;
  25.             // Start PWM mode with updated duty cycle.
  26.         FTM_DRV_PwmStart(MOTO_FTM_INSTANCE, &MotoParam, channel);
  27.         // Software trigger to update registers.
  28.         FTM_HAL_SetSoftwareTriggerCmd(g_ftmBase[MOTO_FTM_INSTANCE], true);
  29. }


FTM 输入捕获的设置
  1. #define MOTO_FTM_BASE                  FTM3
  2. #define MOTO_FTM_INSTANCE              3
  3. #define MOTO_FTM_PERIOD_HZ             100
  4. #define MOTO_0_CHANNEL             0
  5. #define MOTO_1_CHANNEL             1


  6. #define Recive_FTM_BASE                  FTM0
  7. #define Recive_FTM_INSTANCE              0
  8. #define Recive_FTM_PERIOD_HZ             100
  9. #define Recive_0_CHANNEL             0
  10. #define Recive_1_CHANNEL             1

  11. uint32_t Temp_Vlue1_A[2], Temp_Vlue1_B[2], Temp_Vlue2_A[2], Temp_Vlue2_B[2],Temp_Vlue3_A[2];//定时捕获遥控器控制量
  12. //定时捕获暂存值
  13. uint32_t Temp1_A1, Temp1_A2, Temp1_B1, Temp1_B2, Temp2_A1, Temp2_A2, Temp2_B1, Temp2_B2,Temp3_A2,Temp3_A1;
  14. int16_t THROTTLE;
  15. void FTM0_IRQHandler(void)
  16. {
  17.         if (FTM_HAL_IsChnIntEnabled(g_ftmBase[Recive_FTM_INSTANCE], Recive_0_CHANNEL))
  18.     {
  19.         FTM_HAL_ClearChnEventStatus(g_ftmBase[Recive_FTM_INSTANCE], Recive_0_CHANNEL);
  20.                
  21.                 Temp_Vlue2_A[1]= FTM_HAL_GetChnCountVal(g_ftmBase[Recive_FTM_INSTANCE],Recive_0_CHANNEL);       
  22.                 if(Temp_Vlue2_A[0]<Temp_Vlue2_A[1])
  23.                 {
  24.                                 Temp2_A1 = Temp_Vlue2_A[1] - Temp_Vlue2_A[0];
  25.                 }

  26.                 if(Temp2_A1 > 2500)
  27.                 {
  28.                         Temp2_A1 = Temp2_A2;
  29.                 }
  30.                 Temp_Vlue2_A[1] = Temp_Vlue2_A[0];
  31.                 Temp2_A2 = Temp2_A1;
  32.                 THROTTLE = Temp2_A2;        //油门的大小
  33.                
  34.                 if(Temp_Vlue2_A[0]<Temp_Vlue2_A[1])
  35.                 {
  36.                                 Temp2_A1 = Temp_Vlue2_A[1] - Temp_Vlue2_A[0];
  37.                 }
  38.     }
  39.         if(FTM_HAL_GetChnCountVal(g_ftmBase[Recive_FTM_INSTANCE],Recive_0_CHANNEL) > 12000) FTM_HAL_SetCounter(g_ftmBase[Recive_FTM_INSTANCE], 0);             //计时器清零       
  40. }
  1.     ftm_user_config_t ftmInfo;
  2.     // Configure ftm params with frequency 24kHZ
  3.     ftm_pwm_param_t ftmParam = {
  4.         .mode                   = kFtmInputCapture,
  5.         .edgeMode               = kFtmHighTrue,
  6.         .uFrequencyHZ           = 50u,
  7.         .uDutyCyclePercent      = 0,
  8.         .uFirstEdgeDelayPercent = 0,
  9.     };
  10.        
  11.         hardware_init();
  12.         configure_ftm_pins(Recive_FTM_INSTANCE);
  13.     OSA_Init();

  14.        
  15.           while(1){
  16.                         PRINTF("\r\n====== %d  ======\r\n\r\n", THROTTLE);
  17.                         OSA_TimeDelay(40u);
  18.         }

  19.     // Print a note to terminal.
  20.     PRINTF("\r\nWelcome to FTM example\r\n");
  21.     PRINTF("\r\nSee the change of LED brightness");

  22.     // Initialize FTM module,
  23.     // configure for software trigger.zsaA
  24.     memset(&ftmInfo, 0, sizeof(ftmInfo));
  25.     ftmInfo.syncMethod = kFtmUseSoftwareTrig;
  26.     FTM_DRV_Init(Recive_FTM_INSTANCE, &ftmInfo);
  27.     FTM_DRV_SetClock(MOTO_FTM_INSTANCE, kClock_source_FTM_SystemClk, kFtmDividedBy64);
  1. void configure_ftm_pins(uint32_t instance)
  2. {
  3.   switch(instance) {
  4.         case FTM0_IDX:                       /* FTM0 */
  5.       /* Affects PORTA_PCR7 register */
  6.       PORT_HAL_SetDriveStrengthMode(PORTC,1u,kPortLowDriveStrength);  
  7.       PORT_HAL_SetMuxMode(PORTC,1u,kPortMuxAlt4);
  8.       PORT_HAL_SetSlewRateMode(PORTC,1u,kPortSlowSlewRate);
  9.           
  10.           PORT_HAL_SetDriveStrengthMode(PORTC,2u,kPortLowDriveStrength);  
  11.       PORT_HAL_SetMuxMode(PORTC,2u,kPortMuxAlt4);
  12.       PORT_HAL_SetSlewRateMode(PORTC,2u,kPortSlowSlewRate);
  13.           
  14.           PORT_HAL_SetDriveStrengthMode(PORTC,3u,kPortLowDriveStrength);  
  15.       PORT_HAL_SetMuxMode(PORTC,3u,kPortMuxAlt4);
  16.       PORT_HAL_SetSlewRateMode(PORTC,3u,kPortSlowSlewRate);
  17.        
  18.           PORT_HAL_SetDriveStrengthMode(PORTA,0u,kPortLowDriveStrength);  
  19.       PORT_HAL_SetMuxMode(PORTA,0u,kPortMuxAlt3);
  20.       PORT_HAL_SetSlewRateMode(PORTA,0u,kPortSlowSlewRate);
  21.        
  22.           PORT_HAL_SetDriveStrengthMode(PORTA,1u,kPortLowDriveStrength);  
  23.       PORT_HAL_SetMuxMode(PORTA,1u,kPortMuxAlt3);
  24.       PORT_HAL_SetSlewRateMode(PORTA,1u,kPortSlowSlewRate);
  25.        
  26.           PORT_HAL_SetDriveStrengthMode(PORTA,2u,kPortLowDriveStrength);  
  27.       PORT_HAL_SetMuxMode(PORTA,2u,kPortMuxAlt3);
  28.       PORT_HAL_SetSlewRateMode(PORTA,2u,kPortSlowSlewRate);
  29.       break;
  30.         case FTM3_IDX:
  31.           /* Affects PORTA_PCR7 register */
  32.       PORT_HAL_SetDriveStrengthMode(PORTD,0u,kPortLowDriveStrength);  
  33.       PORT_HAL_SetMuxMode(PORTD,0u,kPortMuxAlt4);
  34.       PORT_HAL_SetSlewRateMode(PORTD,0u,kPortSlowSlewRate);
  35.        
  36.           PORT_HAL_SetDriveStrengthMode(PORTD,1u,kPortLowDriveStrength);  
  37.       PORT_HAL_SetMuxMode(PORTD,1u,kPortMuxAlt4);
  38.       PORT_HAL_SetSlewRateMode(PORTD,1u,kPortSlowSlewRate);
  39.        
  40.           PORT_HAL_SetDriveStrengthMode(PORTD,2u,kPortLowDriveStrength);  
  41.       PORT_HAL_SetMuxMode(PORTD,2u,kPortMuxAlt4);
  42.       PORT_HAL_SetSlewRateMode(PORTD,2u,kPortSlowSlewRate);
  43.        
  44.           PORT_HAL_SetDriveStrengthMode(PORTD,3u,kPortLowDriveStrength);  
  45.       PORT_HAL_SetMuxMode(PORTD,3u,kPortMuxAlt4);
  46.       PORT_HAL_SetSlewRateMode(PORTD,3u,kPortSlowSlewRate);
  47.       break;
  48.                   
  49. //    case FTM0_IDX:                       /* FTM0 */
  50. //      /* Affects PORTC_PCR1 register */
  51. //      PORT_HAL_SetMuxMode(PORTC,1u,kPortMuxAlt4);
  52. //      break;
  53.     default:
  54.       break;
  55.   }
  56. }




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:hungry

10

主题

36

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部