bsp_V8M_pwm.c 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. #if 0
  2. #include "bsp_V8M_pwm.h"
  3. #include "stm32f4xx.h"
  4. /*------------------ Macros definitions --------------------------------------*/
  5. #define V8M_MOTOR_PERIOD 2500 /* PWM输出的周期,单位 us */
  6. #define V8M_PWM_DEF_VALUE 1000 /* 默认初始化的 PWM 占空比 */
  7. /**----------------- Variables definitions -----------------------------------*/
  8. /*------------------ Functions definitions -----------------------------------*/
  9. static void _v8m_motor_pwm_gpio_config(void);
  10. static void _v8m_motor_pwm_timer_config(void);
  11. /**
  12. * @brief pwm 初始化
  13. */
  14. void Bsp_V8M_PwmInit(void)
  15. {
  16. _v8m_motor_pwm_gpio_config();
  17. _v8m_motor_pwm_timer_config();
  18. //输出默认值
  19. for (uint8_t i = V8M_PWM_CH1; i <= V8M_PWM_CH10; ++i)
  20. Bsp_V8M_PwmSetCHValue(i, 1000);
  21. }
  22. /**
  23. * @brief pwm 输出 gpio 配置
  24. * TIM4->CH1 ~ TIM4->CH4 为 PWM1 ~ PWM4
  25. * TIM3->CH1 ~ TIM3->CH2 为 PWM5 ~ PWM6
  26. * TIM2->CH1 ~ TIM2->CH2 为 PWM7 ~ PWM8
  27. * TIM3->CH3 ~ TIM3->CH4 为 PWM9 ~ PWM10
  28. *
  29. * PA5 ------> TIM2_CH1
  30. * PB3 ------> TIM2_CH2
  31. *
  32. * PC6 ------> TIM3_CH1
  33. * PC7 ------> TIM3_CH2
  34. * PB0 ------> TIM3_CH3
  35. * PB1 ------> TIM3_CH4
  36. *
  37. * PB6 ------> TIM4_CH1
  38. * PB7 ------> TIM4_CH2
  39. * PB8 ------> TIM4_CH3
  40. * PB9 ------> TIM4_CH4
  41. */
  42. static void _v8m_motor_pwm_gpio_config(void)
  43. {
  44. GPIO_InitTypeDef GPIO_InitStructure;
  45. GPIO_StructInit(&GPIO_InitStructure);
  46. /* GPIOA and GPIOB and GPIOC clock enable */
  47. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB |
  48. RCC_AHB1Periph_GPIOC,
  49. ENABLE);
  50. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3 |
  51. GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 |
  52. GPIO_Pin_9;
  53. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
  54. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  55. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 复用推挽输出
  56. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  57. GPIO_Init(GPIOB, &GPIO_InitStructure);
  58. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  59. GPIO_Init(GPIOA, &GPIO_InitStructure);
  60. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
  61. GPIO_Init(GPIOC, &GPIO_InitStructure);
  62. // enable pwm out put
  63. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  64. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  65. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  66. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
  67. GPIO_Init(GPIOC, &GPIO_InitStructure);
  68. GPIO_SetBits(GPIOC, GPIO_Pin_13);
  69. GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_TIM4);
  70. GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_TIM4);
  71. GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_TIM4);
  72. GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_TIM4);
  73. GPIO_PinAFConfig(GPIOB, GPIO_PinSource0, GPIO_AF_TIM3);
  74. GPIO_PinAFConfig(GPIOB, GPIO_PinSource1, GPIO_AF_TIM3);
  75. GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_TIM3);
  76. GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_TIM3);
  77. GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_TIM2);
  78. GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_TIM2);
  79. }
  80. /**
  81. * @brief pwm 定时器初始化
  82. *
  83. */
  84. static void _v8m_motor_pwm_timer_config(void)
  85. {
  86. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  87. TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  88. TIM_OCInitTypeDef TIM_OCInitStructure;
  89. TIM_OCStructInit(&TIM_OCInitStructure);
  90. //开定时器时钟
  91. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM4 |
  92. RCC_APB1Periph_TIM3,
  93. ENABLE);
  94. TIM_TimeBaseStructure.TIM_Period = V8M_MOTOR_PERIOD;
  95. TIM_TimeBaseStructure.TIM_Prescaler = 84 - 1;
  96. TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  97. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  98. TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
  99. TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  100. TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  101. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  102. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  103. TIM_OCInitStructure.TIM_Pulse = V8M_PWM_DEF_VALUE;
  104. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  105. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  106. TIM_OC1Init(TIM4, &TIM_OCInitStructure);
  107. TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
  108. TIM_OC2Init(TIM4, &TIM_OCInitStructure);
  109. TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);
  110. TIM_OC3Init(TIM4, &TIM_OCInitStructure);
  111. TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);
  112. TIM_OC4Init(TIM4, &TIM_OCInitStructure);
  113. TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);
  114. TIM_OC1Init(TIM3, &TIM_OCInitStructure);
  115. TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
  116. TIM_OC2Init(TIM3, &TIM_OCInitStructure);
  117. TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
  118. TIM_OC3Init(TIM3, &TIM_OCInitStructure);
  119. TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
  120. TIM_OC4Init(TIM3, &TIM_OCInitStructure);
  121. TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
  122. TIM_OC1Init(TIM2, &TIM_OCInitStructure);
  123. TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
  124. TIM_OC2Init(TIM2, &TIM_OCInitStructure);
  125. TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);
  126. // 使能TIMx重载寄存器ARR
  127. TIM_ARRPreloadConfig(TIM2, ENABLE);
  128. TIM_ARRPreloadConfig(TIM4, ENABLE);
  129. TIM_ARRPreloadConfig(TIM3, ENABLE);
  130. //使能定时器x
  131. TIM_Cmd(TIM4, ENABLE);
  132. TIM_Cmd(TIM3, ENABLE);
  133. TIM_Cmd(TIM2, ENABLE);
  134. // enable pwm out put
  135. GPIO_ResetBits(GPIOC, GPIO_Pin_13);
  136. }
  137. /**
  138. * @brief 改变 pwm 通道值
  139. * TIM4->CH1 ~ TIM4->CH4 为 PWM1 ~ PWM4
  140. * TIM3->CH1 ~ TIM3->CH2 为 PWM5 ~ PWM6
  141. * TIM2->CH1 ~ TIM2->CH2 为 PWM7 ~ PWM8
  142. * TIM3->CH3 ~ TIM3->CH4 为 PWM9 ~ PWM10
  143. */
  144. void Bsp_V8M_PwmSetCHValue(uint8_t m_ch, uint16_t m_value)
  145. {
  146. switch (m_ch)
  147. {
  148. case 1:
  149. TIM4->CCR1 = m_value;
  150. break;
  151. case 2:
  152. TIM4->CCR2 = m_value;
  153. break;
  154. case 3:
  155. TIM4->CCR3 = m_value;
  156. break;
  157. case 4:
  158. TIM4->CCR4 = m_value;
  159. break;
  160. case 5:
  161. TIM3->CCR1 = m_value;
  162. break;
  163. case 6:
  164. TIM3->CCR2 = m_value;
  165. break;
  166. case 7:
  167. TIM2->CCR1 = m_value;
  168. break;
  169. case 8:
  170. TIM2->CCR2 = m_value;
  171. break;
  172. case 9:
  173. TIM3->CCR3 = m_value;
  174. break;
  175. case 10:
  176. TIM3->CCR4 = m_value;
  177. break;
  178. default:
  179. break;
  180. }
  181. }
  182. /**
  183. * @brief 获取 pwm 通道值
  184. * TIM4->CH1 ~ TIM4->CH4 为 PWM1 ~ PWM4
  185. * TIM3->CH1 ~ TIM3->CH2 为 PWM5 ~ PWM6
  186. * TIM2->CH1 ~ TIM2->CH2 为 PWM7 ~ PWM8
  187. * TIM3->CH3 ~ TIM3->CH4 为 PWM9 ~ PWM10
  188. */
  189. uint16_t Bsp_V8M_PwmGetCHValue(uint8_t m_ch)
  190. {
  191. uint16_t m_value = 0;
  192. switch (m_ch)
  193. {
  194. case 1:
  195. m_value = TIM4->CCR1;
  196. break;
  197. case 2:
  198. m_value = TIM4->CCR2;
  199. break;
  200. case 3:
  201. m_value = TIM4->CCR3;
  202. break;
  203. case 4:
  204. m_value = TIM4->CCR4;
  205. break;
  206. case 5:
  207. m_value = TIM3->CCR1;
  208. break;
  209. case 6:
  210. m_value = TIM3->CCR2;
  211. break;
  212. case 7:
  213. m_value = TIM2->CCR1;
  214. break;
  215. case 8:
  216. m_value = TIM2->CCR2;
  217. break;
  218. case 9:
  219. m_value = TIM3->CCR3;
  220. break;
  221. case 10:
  222. m_value = TIM3->CCR4;
  223. break;
  224. default:
  225. break;
  226. }
  227. return m_value;
  228. }
  229. #endif