1. #ifndef __BSP_MOTOR_TIM_H
    2. #define __BSP_MOTOR_TIM_H
    3. #include "stm32f4xx.h"
    4. #include ".\bldcm_control\bsp_bldcm_control.h"
    5. /* 电机控制定时器 */
    6. #define MOTOR_TIM TIM8
    7. #define MOTOR_TIM_CLK_ENABLE() __TIM8_CLK_ENABLE()//其实就是时钟 霍尔库的使能
    8. /* 累计 TIM_Period个后产生一个更新或者中断
    9. 当定时器从0计数到5599,即为5600次,为一个定时周期 */
    10. #define PWM_PERIOD_COUNT (5600)
    11. #define PWM_MAX_PERIOD_COUNT (PWM_PERIOD_COUNT - 100)//最大时钟频率不让超过5500
    12. /* 高级控制定时器时钟源TIMxCLK = HCLK = 168MHz
    13. 设定定时器频率为=TIMxCLK/(PWM_PRESCALER_COUNT)/PWM_PERIOD_COUNT = 15KHz 168000000/2/56000=15000 */
    14. #define PWM_PRESCALER_COUNT (2)
    15. /* TIM8通道1输出引脚 */
    16. #define MOTOR_OCPWM1_PIN GPIO_PIN_5
    17. #define MOTOR_OCPWM1_GPIO_PORT GPIOI
    18. #define MOTOR_OCPWM1_GPIO_CLK_ENABLE() __GPIOI_CLK_ENABLE()
    19. #define MOTOR_OCPWM1_AF GPIO_AF3_TIM8
    20. /* TIM8通道2输出引脚 */
    21. #define MOTOR_OCPWM2_PIN GPIO_PIN_6
    22. #define MOTOR_OCPWM2_GPIO_PORT GPIOI
    23. #define MOTOR_OCPWM2_GPIO_CLK_ENABLE() __GPIOI_CLK_ENABLE()
    24. #define MOTOR_OCPWM2_AF GPIO_AF3_TIM8
    25. /* TIM8通道3输出引脚 */
    26. #define MOTOR_OCPWM3_PIN GPIO_PIN_7
    27. #define MOTOR_OCPWM3_GPIO_PORT GPIOI
    28. #define MOTOR_OCPWM3_GPIO_CLK_ENABLE() __GPIOI_CLK_ENABLE()
    29. #define MOTOR_OCPWM3_AF GPIO_AF3_TIM8
    30. /* TIM8通道1互补输出引脚 */
    31. #define MOTOR_OCNPWM1_PIN GPIO_PIN_13
    32. #define MOTOR_OCNPWM1_GPIO_PORT GPIOH
    33. #define MOTOR_OCNPWM1_GPIO_CLK_ENABLE() __GPIOH_CLK_ENABLE()
    34. #define MOTOR_OCNPWM1_AF GPIO_AF3_TIM8
    35. /* TIM8通道2互补输出引脚 */
    36. #define MOTOR_OCNPWM2_PIN GPIO_PIN_14
    37. #define MOTOR_OCNPWM2_GPIO_PORT GPIOH
    38. #define MOTOR_OCNPWM2_GPIO_CLK_ENABLE() __GPIOH_CLK_ENABLE()
    39. #define MOTOR_OCNPWM2_AF GPIO_AF3_TIM8
    40. /* TIM8通道3互补输出引脚 */
    41. #define MOTOR_OCNPWM3_PIN GPIO_PIN_15
    42. #define MOTOR_OCNPWM3_GPIO_PORT GPIOH
    43. #define MOTOR_OCNPWM3_GPIO_CLK_ENABLE() __GPIOH_CLK_ENABLE()
    44. #define MOTOR_OCNPWM3_AF GPIO_AF3_TIM8
    45. #define TIM_COM_TS_ITRx TIM_TS_ITR3 // 内部触发配置(TIM8->ITR3->TIM5)
    46. /* 霍尔传感器定时器 */
    47. #define HALL_TIM TIM5
    48. #define HALL_TIM_CLK_ENABLE() __TIM5_CLK_ENABLE()
    49. extern TIM_HandleTypeDef htimx_hall;
    50. /* 累计 TIM_Period个后产生一个更新或者中断
    51. 当定时器从0计数到0xffff,即为2的16次方,为一个定时周期 */
    52. #define HALL_PERIOD_COUNT (0xFFFF)
    53. /* 通用控制定时器时钟源TIMxCLK = HCLK / 2 = 84MHz
    54. 设定定时器频率为 = TIMxCLK / (PWM_PRESCALER_COUNT) / PWM_PERIOD_COUNT = 10.01Hz
    55. 周期 T = 100ms */
    56. #define HALL_PRESCALER_COUNT (128)
    57. /* TIM5 通道 1 引脚 */
    58. #define HALL_INPUTU_PIN GPIO_PIN_10
    59. #define HALL_INPUTU_GPIO_PORT GPIOH
    60. #define HALL_INPUTU_GPIO_CLK_ENABLE() __GPIOH_CLK_ENABLE()
    61. #define HALL_INPUTU_AF GPIO_AF2_TIM5
    62. /* TIM5 通道 2 引脚 */
    63. #define HALL_INPUTV_PIN GPIO_PIN_11
    64. #define HALL_INPUTV_GPIO_PORT GPIOH
    65. #define HALL_INPUTV_GPIO_CLK_ENABLE() __GPIOH_CLK_ENABLE()
    66. #define HALL_INPUTV_AF GPIO_AF2_TIM5
    67. /* TIM5 通道 3 引脚 */
    68. #define HALL_INPUTW_PIN GPIO_PIN_12
    69. #define HALL_INPUTW_GPIO_PORT GPIOH
    70. #define HALL_INPUTW_GPIO_CLK_ENABLE() __GPIOH_CLK_ENABLE()
    71. #define HALL_INPUTW_AF GPIO_AF2_TIM5
    72. #define HALL_TIM_IRQn TIM5_IRQn
    73. #define HALL_TIM_IRQHandler TIM5_IRQHandler
    74. void TIMx_Configuration(void);
    75. void stop_pwm_output(void);
    76. void set_pwm_pulse(uint16_t pulse);
    77. void hall_enable(void);
    78. void hall_disable(void);
    79. void hall_tim_config(void);
    80. #endif /* __BSP_MOTOR_TIM_H */

    这个头文件是关于电机控制定时器的使用配置。
    电机控制定时器 选择的是定时器8:

    1. /* 电机控制定时器 */
    2. #define MOTOR_TIM TIM8
    3. #define MOTOR_TIM_CLK_ENABLE() __TIM8_CLK_ENABLE()//其实就是时钟 霍尔库的使能

    定时器8属于高级定时器,与其他定时器互相独立。

    这里应该设置的是ARR 也就是自动重载寄存器,按道理来说16位的寄存器是可以累加到65536的,但这里只让他累加到5599,也就是5600

    1. /* 累计 TIM_Period个后产生一个更新或者中断
    2. 当定时器从0计数到5599,即为5600次,为一个定时周期 */
    3. #define PWM_PERIOD_COUNT (5600)
    4. #define PWM_MAX_PERIOD_COUNT (PWM_PERIOD_COUNT - 100)

    定时器的频率计算需要上面那个ARR之外,还需要预分频器寄存器PSC,也就是说如果你想要TIM8产生一个15K的定时,那么你预分频需要是2,ARR需要是5600,这样你的定时器频率就是15K了。
    image.png

    1. /* 高级控制定时器时钟源TIMxCLK = HCLK = 168MHz
    2. 设定定时器频率为=TIMxCLK/(PWM_PRESCALER_COUNT)/PWM_PERIOD_COUNT = 15KHz 168000000/2/56000=15000 */
    3. #define PWM_PRESCALER_COUNT (2)

    接下来就要确定是从哪一个引脚引出PWM了,PI的5、6、7,与PH的13、14、15
    image.png
    image.png

    1. /* TIM8通道1输出引脚 */
    2. #define MOTOR_OCPWM1_PIN GPIO_PIN_5
    3. #define MOTOR_OCPWM1_GPIO_PORT GPIOI
    4. #define MOTOR_OCPWM1_GPIO_CLK_ENABLE() __GPIOI_CLK_ENABLE()
    5. #define MOTOR_OCPWM1_AF GPIO_AF3_TIM8
    6. /* TIM8通道2输出引脚 */
    7. #define MOTOR_OCPWM2_PIN GPIO_PIN_6
    8. #define MOTOR_OCPWM2_GPIO_PORT GPIOI
    9. #define MOTOR_OCPWM2_GPIO_CLK_ENABLE() __GPIOI_CLK_ENABLE()
    10. #define MOTOR_OCPWM2_AF GPIO_AF3_TIM8
    11. /* TIM8通道3输出引脚 */
    12. #define MOTOR_OCPWM3_PIN GPIO_PIN_7
    13. #define MOTOR_OCPWM3_GPIO_PORT GPIOI
    14. #define MOTOR_OCPWM3_GPIO_CLK_ENABLE() __GPIOI_CLK_ENABLE()
    15. #define MOTOR_OCPWM3_AF GPIO_AF3_TIM8
    16. /* TIM8通道1互补输出引脚 */
    17. #define MOTOR_OCNPWM1_PIN GPIO_PIN_13
    18. #define MOTOR_OCNPWM1_GPIO_PORT GPIOH
    19. #define MOTOR_OCNPWM1_GPIO_CLK_ENABLE() __GPIOH_CLK_ENABLE()
    20. #define MOTOR_OCNPWM1_AF GPIO_AF3_TIM8
    21. /* TIM8通道2互补输出引脚 */
    22. #define MOTOR_OCNPWM2_PIN GPIO_PIN_14
    23. #define MOTOR_OCNPWM2_GPIO_PORT GPIOH
    24. #define MOTOR_OCNPWM2_GPIO_CLK_ENABLE() __GPIOH_CLK_ENABLE()
    25. #define MOTOR_OCNPWM2_AF GPIO_AF3_TIM8
    26. /* TIM8通道3互补输出引脚 */
    27. #define MOTOR_OCNPWM3_PIN GPIO_PIN_15
    28. #define MOTOR_OCNPWM3_GPIO_PORT GPIOH
    29. #define MOTOR_OCNPWM3_GPIO_CLK_ENABLE() __GPIOH_CLK_ENABLE()
    30. #define MOTOR_OCNPWM3_AF GPIO_AF3_TIM8

    互补输出引脚
    image.png

    主从模式,内部触发,这里应该是使用TIM8内部触发TIM5(霍尔的传感器定时器)

    1. #define TIM_COM_TS_ITRx TIM_TS_ITR3 // 内部触发配置(TIM8->ITR3->TIM5)

    image.png

    之后就是霍尔定时器的一些配置,用的是通用定时器TIM5,设置其定时器频率为10HZ

    1. /* 累计 TIM_Period个后产生一个更新或者中断
    2. 当定时器从0计数到0xffff,即为2的16次方,为一个定时周期 */
    3. #define HALL_PERIOD_COUNT (0xFFFF)
    4. /* 通用控制定时器时钟源TIMxCLK = HCLK / 2 = 84MHz
    5. 设定定时器频率为 = TIMxCLK / (PWM_PRESCALER_COUNT) / PWM_PERIOD_COUNT = 10.01Hz
    6. 周期 T = 100ms */
    7. #define HALL_PRESCALER_COUNT (128)

    注意还有一个引脚复用的知识点
    image.png
    image.png