2765|1

18

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

无刷云台研究记录——遥控:PWM脉冲宽度测量 [复制链接]


在了解遥控数据交换协议之前,首先对常用的协议有所了解,推荐一篇科普文章:
http://www.docin.com/p-680140417.html
若该链接无效可以搜索关键字“APM PX4飞控开发笔记-第五章:PWM、PPM与S.bus”

之后选择自己需要的协议进行设计,我用的是PWM,所以需要通过定时器对脉冲宽度进行读取。具体代码如下,这并不是我写的,但经测试,可以使用。
  1. // Hold onto the Channel 1 init structure -- we will use it to reverse  
  2. // polarity on every edge interrupt.  
  3. static TIM_ICInitTypeDef TIM_CH1_ICInitStructure;  
  4.   
  5. #define GPIO_AF_TIM2 GPIO_AF_2  
  6.   
  7. void ConfigPwmIn() {  
  8. GPIO_InitTypeDef GPIO_InitStructure;  
  9. TIM_ICInitTypeDef TIM_ICInitStructure;  
  10. NVIC_InitTypeDef NVIC_InitStructure;  
  11.   
  12. TIM_DeInit(TIM2 );  
  13.   
  14. /* TIM2 clock enable */  
  15. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);  
  16.   
  17. /* GPIOC clock enable */  
  18. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOD, ENABLE);  
  19.   
  20. /* TIM2 GPIO pin configuration : CH1=PD3, C2=PD4, CH3=PD7, CH4=PD6 */  
  21. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_7 | GPIO_Pin_6;  
  22. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;  
  23. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  24. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  
  25. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;  
  26. GPIO_Init(GPIOD, &GPIO_InitStructure);  
  27.   
  28. /* Connect pins to TIM3 AF2 */  
  29. GPIO_PinAFConfig(GPIOD, GPIO_PinSource3, GPIO_AF_TIM2 );  
  30. GPIO_PinAFConfig(GPIOD, GPIO_PinSource4, GPIO_AF_TIM2 );  
  31. GPIO_PinAFConfig(GPIOD, GPIO_PinSource7, GPIO_AF_TIM2 );  
  32. GPIO_PinAFConfig(GPIOD, GPIO_PinSource6, GPIO_AF_TIM2 );  
  33.   
  34. NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  
  35. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  
  36. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  
  37. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
  38. NVIC_Init(&NVIC_InitStructure);  
  39.   
  40. /* Enable capture*/  
  41. TIM_CH1_ICInitStructure.TIM_Channel = TIM_Channel_1;  
  42. TIM_CH1_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;  
  43. TIM_CH1_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;  
  44. TIM_CH1_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;  
  45. TIM_CH1_ICInitStructure.TIM_ICFilter = 0;  
  46. TIM_ICInit(TIM2, &TIM_ICInitStructure);  
  47. TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;  
  48. TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;  
  49. TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;  
  50. TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;  
  51. TIM_ICInitStructure.TIM_ICFilter = 0;  
  52. TIM_ICInit(TIM2, &TIM_ICInitStructure);  
  53. TIM_ICInitStructure.TIM_Channel = TIM_Channel_3;  
  54. TIM_ICInit(TIM2, &TIM_ICInitStructure);  
  55. TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;  
  56. TIM_ICInit(TIM2, &TIM_ICInitStructure);  
  57.   
  58. /* Enable TIM2 */  
  59. TIM_Cmd(TIM2, ENABLE);  
  60.   
  61. /* Enable CC1-4 interrupt */  
  62. TIM_ITConfig(TIM2, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4, ENABLE);  
  63.   
  64. /* Clear CC1 Flag*/  
  65. TIM_ClearFlag(TIM2, TIM_FLAG_CC1 | TIM_FLAG_CC2 | TIM_FLAG_CC3 | TIM_FLAG_CC4 );  
  66. }  
  67.   
  68. static volatile uint32_t ccr[4];  
  69. static volatile char pulseState = 0;  
  70.   
  71. void TIM2_IRQHandler() {  
  72. if (TIM2 ->SR & TIM_IT_CC1 ) {  
  73.   TIM2 ->SR &= (~TIM_IT_CC1 );  
  74.   
  75.   if (pulseState == 0) {  
  76.    TIM_CH1_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;  
  77.   
  78.    // Any time we get a rising edge on CH1, we reset the counter. All channels are  
  79.    // phase aligned, so they all use this as a reference.  
  80.    TIM_SetCounter(TIM2, 0);  
  81.   } else {  
  82.    TIM_CH1_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;  
  83.   
  84.    // Pull the value on the falling edge.  
  85.    ccr[0] = TIM_GetCapture1(TIM2 );  
  86.   }  
  87.   pulseState = !pulseState;  
  88.   
  89.   // Reverse polarity.  
  90.   TIM_ICInit(TIM2, &TIM_CH1_ICInitStructure);  
  91. }  
  92.   
  93. if (TIM2 ->SR & TIM_IT_CC2 ) {  
  94.   TIM2 ->SR &= (~TIM_IT_CC2 );  
  95.   ccr[1] = TIM_GetCapture2(TIM2 );  
  96. }  
  97. if (TIM2 ->SR & TIM_IT_CC3 ) {  
  98.   TIM2 ->SR &= (~TIM_IT_CC3 );  
  99.   ccr[2] = TIM_GetCapture3(TIM2 );  
  100. }  
  101. if (TIM2 ->SR & TIM_IT_CC4 ) {  
  102.   TIM2 ->SR &= (~TIM_IT_CC4 );  
  103.   ccr[3] = TIM_GetCapture4(TIM2 );  
  104. }  
  105. }
复制代码
以上代码来自《stm32 pwm捕获学习笔记》,该Blog中列出了几种测量方式,可以根据需要选择合适的加以运用。

获取了PWM脉冲宽度,就可以归一化处理后加入控制。


此帖出自stm32/stm8论坛

最新回复

不错  看看 :)   详情 回复 发表于 2015-8-28 10:16
点赞 关注
 

回复
举报

565

帖子

513

TA的资源

裸片初长成(中级)

沙发
 
不错  看看 :)
此帖出自stm32/stm8论坛
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表