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