打印
[APM32F4]

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

[复制链接]
559|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 信号在每个周期的开始时,输出引脚的电平会从低电平变为高电平,然后在周期的中间保持高电平,最后在周期的结束时从高电平变为低电平。这种模式的优点是可以产生稳定的脉冲宽度调制信号,并且可以通过调整占空比来控制输出功率。
TMR_HandleTypeDef hTMR1;

void MX_TMR1_Init(void) {
    TMR_OC_InitTypeDef sConfigOC = {0};

    hTMR1.Instance = TMR1;
    hTMR1.Init.Prescaler = 0;
    hTMR1.Init.CounterMode = TMR_COUNTERMODE_UP;
    hTMR1.Init.Period = 255;
    hTMR1.Init.ClockDivision = TMR_CLOCKDIVISION_DIV1;
    hTMR1.Init.RepetitionCounter = 0;
    if (DAL_TMR_PWM_Init(&hTMR1) != DAL_OK) {
        DAL_ErrorHandler();
    }

    sConfigOC.OCMode = TMR_OCMODE_PWM1;
    sConfigOC.Pulse = 0;
    sConfigOC.OCPolarity = TMR_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TMR_OCFAST_DISABLE;
    if (DAL_TMR_PWM_ConfigChannel(&hTMR1, &sConfigOC, TMR_CHANNEL_1) != DAL_OK) {
        DAL_ErrorHandler();
    }

    DAL_TMR_PWM_MspInit(&hTMR1);
}

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


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

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

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

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

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

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

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

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

    MX_TMR1_Init();

start_progressive_mode();
}









使用特权

评论回复
沙发
星辰大海不退缩| | 2024-6-22 20:58 | 只看该作者
PWM 代码驱动震动马达非常经典的应用

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

50

帖子

1

粉丝