[APM32F4] APM32F411V Tiny Board测评】-4-pwm代码测试和震动马达的驱动

[复制链接]
 楼主| chenqiguang1998 发表于 2024-5-29 18:07 | 显示全部楼层 |阅读模式
本帖最后由 chenqiguang1998 于 2024-6-3 13:24 编辑

#每日话题# #申请原创# 在本次测评中,我们将对 APM32F411V Tiny Board 的 PWM 代码进行测试,并尝试驱动震动马达。

一、引脚设置

根据需求,我们需要将震动马达连接到 APM32F411V Tiny Board 的 PWM 引脚上。参考手册中,我们可以将震动马达的控制引脚连接到 APM32F411V Tiny Board 的 PB3 引脚上。
二、PWM 设置的类型和原因

在 APM32F411V Tiny Board 中,PWM 模块可以产生不同类型的脉冲宽度调制信号,包括中心对齐模式和边沿对齐模式。在本次测评中,我们将使用边沿对齐模式,因为这种模式更适合驱动震动马达。

边沿对齐模式的 PWM 信号在每个周期的开始时,输出引脚的电平会从低电平变为高电平,然后在周期的中间保持高电平,最后在周期的结束时从高电平变为低电平。这种模式的优点是可以产生稳定的脉冲宽度调制信号,并且可以通过调整占空比来控制输出功率。
  1. TMR_HandleTypeDef hTMR1;

  2. void MX_TMR1_Init(void) {
  3.     TMR_OC_InitTypeDef sConfigOC = {0};

  4.     hTMR1.Instance = TMR1;
  5.     hTMR1.Init.Prescaler = 0;
  6.     hTMR1.Init.CounterMode = TMR_COUNTERMODE_UP;
  7.     hTMR1.Init.Period = 255;
  8.     hTMR1.Init.ClockDivision = TMR_CLOCKDIVISION_DIV1;
  9.     hTMR1.Init.RepetitionCounter = 0;
  10.     if (DAL_TMR_PWM_Init(&hTMR1) != DAL_OK) {
  11.         DAL_ErrorHandler();
  12.     }

  13.     sConfigOC.OCMode = TMR_OCMODE_PWM1;
  14.     sConfigOC.Pulse = 0;
  15.     sConfigOC.OCPolarity = TMR_OCPOLARITY_HIGH;
  16.     sConfigOC.OCFastMode = TMR_OCFAST_DISABLE;
  17.     if (DAL_TMR_PWM_ConfigChannel(&hTMR1, &sConfigOC, TMR_CHANNEL_1) != DAL_OK) {
  18.         DAL_ErrorHandler();
  19.     }

  20.     DAL_TMR_PWM_MspInit(&hTMR1);
  21. }

  22. // 设置 PWM 占空比和频率的函数
  23. void setPWM(uint32_t dutyCycle, uint32_t frequency) {
  24.     uint32_t period = DAL_RCC_GetHCLKFreq() / frequency;
  25.     __DAL_TMR_SET_AUTORELOAD(&hTMRx, period);
  26.     __DAL_TMR_SET_COMPARE(&hTMRx, TMR_CHANNEL_x, dutyCycle);
  27.     __DAL_TMR_ENABLE(&hTMRx);
  28. }


三、确定震动马达的驱动方式

为了方便控制震动马达的驱动方式,我们可以使用宏定义来确定驱动方式。在本次测评中,我们将定义两个方式,一个用于直接进行强弱渐进的驱动方式,另一个用于根据读取的 MPU6050 的换算数据和压力薄膜传感器的转换数据根据权重来实时更改 PWM 的驱动强弱。
  1. //马达控制
  2. // PWM 参数设置函数
  3. void set_soft_mode_params(void) {
  4.     setPWM(50, 1000);  // 设置占空比为 50%,频率为 1000Hz
  5. }

  6. void set_normal_mode_params(void) {
  7.     setPWM(80, 1500);  // 设置占空比为 80%,频率为 1500Hz
  8. }

  9. void set_strong_mode_params(void) {
  10.     setPWM(100, 2000);  // 设置占空比为 100%,频率为 2000Hz
  11. }

  12. // 渐进模式启动函数
  13. void start_progressive_mode() {
  14.     uint32_t step = 10;  // 渐进模式的步长
  15.     uint32_t currentDutyCycle = 0;  // 渐进模式的当前占空比

  16.     while (currentDutyCycle <= 100) {  // 渐进模式持续到占空比达到 100%
  17.         setPWM(currentDutyCycle, 1000);  // 设置当前占空比和频率
  18.         currentDutyCycle += step;  // 增加占空比
  19.         DAL_Delay(100);
  20.     }
  21. }

  22. // 传感器基于模式启动函数
  23. void start_sensor_based_mode() {
  24. process_sensor_data_and_set_motor_strength();
  25. }

  26. void set_stop_mode_params(void) {
  27.     setPWM(100, 2000);  // 设置占空比为 100%,频率为 2000Hz
  28. }
最后选取一种驱动模式进行测试:
  1. int main()
  2. {
  3.     HAL_Init();
  4.     SystemClock_Config();

  5.     MX_TMR1_Init();

  6. start_progressive_mode();
  7. }









星辰大海不退缩 发表于 2024-6-22 20:58 | 显示全部楼层
PWM 代码驱动震动马达非常经典的应用
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

59

帖子

1

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

10

主题

59

帖子

1

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