本帖最后由 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();
- }
|