hard_sbusout_af_pump.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #if 0
  2. #include "hard_sbusout_af_pump.h"
  3. #include "stm32f4xx.h"
  4. #define SBUSOUT_AF_PUMP_PERIOD 20000 // subsout复用为水泵输出
  5. #define PUMP_DEF_VALUE 1000
  6. static void sbusout_af_pump_gpio_config(void);
  7. static void sbusout_af_pump_timer_config(void);
  8. /**************************实现函数********************************************
  9. *函数原型: void sbusout_af_pump_init(void)
  10. *功  能: PWM输出 初始化。
  11. *******************************************************************************/
  12. void sbusout_af_pump_init(void)
  13. {
  14. sbusout_af_pump_gpio_config();
  15. sbusout_af_pump_timer_config();
  16. }
  17. /**************************实现函数********************************************
  18. *函数原型: static void sbusout_af_pump_gpio_config(void)
  19. *功  能: 配置PWM引脚为输出,并开启相应的时钟信号 和引脚复用时钟信号
  20. *******************************************************************************/
  21. static void sbusout_af_pump_gpio_config(void)
  22. {
  23. GPIO_InitTypeDef GPIO_InitStructure;
  24. /* GPIOA and GPIOB and GPIOC clock enable */
  25. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  26. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  27. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;
  28. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  29. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 复用推挽输出
  30. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  31. GPIO_Init(GPIOA, &GPIO_InitStructure);
  32. GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_TIM9);
  33. }
  34. /**************************实现函数********************************************
  35. *函数原型: static void sbusout_af_pump_timer_config(void)
  36. *功  能: 配置PWM的对应定时器
  37. //通用定时器3中断初始化,使用定时器3的溢出中断来确定HZ数
  38. //TIM_Period:自动重装值。
  39. //TIM_Prescaler:时钟预分频数
  40. //定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
  41. //Ft=定时器工作频率,单位:Mhz
  42. //这里使用的是定时器3!
  43. //来自STM32F4手册:高速APB2域的最大允许频率是84MHZ,低速APB1域的最大允许频率是42MHZ
  44. *******************************************************************************/
  45. static void sbusout_af_pump_timer_config(void)
  46. {
  47. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  48. TIM_OCInitTypeDef TIM_OCInitStructure;
  49. //开定时器时钟
  50. RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM9, ENABLE);
  51. //=============Time base configuration========================
  52. // PWM周期,2.5ms,400hz
  53. TIM_TimeBaseStructure.TIM_Period = SBUSOUT_AF_PUMP_PERIOD;
  54. //设置预分频:即为1MHz。1ms = 1000次计数
  55. TIM_TimeBaseStructure.TIM_Prescaler = 168 - 1;
  56. //设置时钟分频系数:不分频
  57. TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  58. //向上计数模式
  59. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  60. //初始化定时器
  61. TIM_TimeBaseStructure.TIM_Period = SBUSOUT_AF_PUMP_PERIOD; // PWM周期
  62. TIM_TimeBaseInit(TIM9, &TIM_TimeBaseStructure);
  63. //===================TIM_OCInitStructure base
  64. //configuration==================
  65. //配置为PWM模式1
  66. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  67. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  68. //设置跳变值,当计数器计数到大于这个值时,电平发生跳变
  69. //,,TIMx->CCRx的值,设置占空比,在更新电机的地方实时更新这个值
  70. TIM_OCInitStructure.TIM_Pulse = PUMP_DEF_VALUE;
  71. //当定时器计数值小于CCR1_Val时为高电平
  72. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
  73. //===================================================================================
  74. //* PA2 TIM9_CHA
  75. //*
  76. //* 每一个通用定时器可以产生四路频率一致占空比可调节的独立的PWM波形,
  77. //* TIM_OC1Init 1通道 TIM_OC2Init 2通道 TIM_OC3Init 3通道 TIM_OC4Init
  78. //4通道
  79. //*
  80. //* 哪个管脚对应哪个TIM的哪个CH由硬件设计已经决定
  81. //========================================================================================
  82. //=================使能通道=================================
  83. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  84. // TIME9的通道1 SUBSOUT_AF_PWM
  85. TIM_OC1Init(TIM9, &TIM_OCInitStructure);
  86. TIM_OC1PreloadConfig(TIM9, TIM_OCPreload_Enable);
  87. //使能TIMx重载寄存器ARR
  88. TIM_ARRPreloadConfig(TIM9, ENABLE);
  89. //使能定时器x
  90. TIM_Cmd(TIM9, ENABLE);
  91. }
  92. #endif