06 HAL库驱动PWM常见的外设

2024-01-01 11:40:53

引言: 本篇文章我还想给大家分享一下使用到PWM的一些常见外设, 如风扇, 震动马达, 直流电机。这篇文章的基本知识部分就只介绍这些外设的基本知识了, PWM的基本知识有不懂的大家去看蜂鸣器的那篇文章。

一、风扇、震动马达、直流电机的基本知识


1. 工作原理简述

风扇、直流电机和震动马达的工作原理如下:

1. 风扇的工作原理:风扇通常由一个直流电机驱动。当电流通过电机的绕组时,会产生一个旋转磁场。这个磁场与永久磁铁或永磁体之间的相互作用,使得风扇的叶片开始旋转,从而产生风。

2. 直流电机的工作原理:直流电机主要由电枢和永磁体组成。电枢是由一组线圈或者绕组构成,当通电时会产生一个旋转磁场。这个旋转磁场与永磁体之间的相互作用,使得电机的转子开始旋转。

3. 震动马达的工作原理:震动马达是一种特殊类型的电机,它通过产生震动或振动来工作。震动马达利用电磁原理,当电流通过马达时,会产生一个旋转磁场。这个旋转磁场与震动马达内部的振荡器或偏心轮之间的相互作用,使得马达产生震动或振动。

总的来说,风扇、直流电机和震动马达的工作原理都是利用电流通过线圈或绕组产生的磁场与永磁体之间的相互作用来实现机械运动。

2.实物图

  • 电机的实物图

  • 风扇和震动马达的实物图

3. PWM能控制电机的转速的原理

????????PWM(脉宽调制)是一种通过改变信号的脉冲宽度来控制电机转速的技术。基本原理如下: 1. 控制信号:PWM信号由固定的周期和可变的脉冲宽度组成。周期是指每个PWM周期的时间长度,而脉冲宽度是指高电平(高电压)的时间长度。

2. 控制方式:对于电机而言,PWM信号被应用于控制输入(例如电机驱动器的控制端口)。通过改变PWM信号的脉冲宽度,可以控制电机的速度。

3. 转速控制:当PWM信号的脉冲宽度较小时,电机感受到的平均电压较低,电机转速相对较低。当PWM信号的脉冲宽度增加时,电机感受到的平均电压增加,电机转速也相应增加。

4. 调制比例:PWM信号的脉冲宽度与周期之间的比值被称为调制比例。通常以百分比表示,例如50%,80%等。调制比例越高,电机转速越快。

总的来说,通过调整PWM信号的脉冲宽度,可以改变电机接收到的平均电压,从而控制电机的转速。

以上说成大白话, 因为pwm的高电平所占的时间和每一秒经过的高电平的次数不一样, 是不是就会导致pwm驱动的外设的电机转速不一样,也就是每一秒钟通过的高电平的次数越多,高电平在一个周期内的占空比大, 电机的转速就会快, 就是根据这个原理来调速的。

二、实验开始


还是一样的, 创建工程啥的就不演示了, 我把代码奉上。

驱动风扇:

/*
 * fan.h
 *
 *  Created on: Dec 29, 2023
 *      Author: 哈西好多
 */

#ifndef INC_FAN_H_
#define INC_FAN_H_

#include "stm32mp1xx_hal.h"

#define FULL_PERID (100)

#define FAN_STOP (0)
#define FIRST_GEAR (FULL_PERID / 3)
#define SECOND_GEAR (FULL_PERID / 2)
#define FULL_GEAR (FULL_PERID)

enum fanCtl_flag {
	FAN_ON,
	FAN_OFF
};

extern void fan_ctl(enum fanCtl_flag, uint16_t gear);
#endif /* INC_FAN_H_ */
/*
 * fan.c
 *
 *  Created on: Dec 29, 2023
 *      Author: 哈西好多
 */
#include "fan.h"

extern TIM_HandleTypeDef htim1;

void fan_ctl(enum fanCtl_flag flag, uint16_t gear)
{
	if(flag == FAN_ON) {
		HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
		__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, gear);

	} else if(flag == FAN_OFF) {
		HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1);
	}
}

驱动震动马达:

/*
 * shake_motor.h
 *
 *  Created on: Dec 30, 2023
 *      Author: 哈西好多
 */

#ifndef INC_SHAKE_MOTOR_H_
#define INC_SHAKE_MOTOR_H_

enum motor_flag {
	motor_on,
	motor_off
};

extern void shake_motor_ctl(enum motor_flag flag);

#endif /* INC_SHAKE_MOTOR_H_ */
/*
 * shake_motor.c
 *
 *  Created on: Dec 30, 2023
 *      Author: 哈西好多
 */

#include "shake_motor.h"
#include "stm32mp1xx_hal.h"

extern TIM_HandleTypeDef htim16;

void shake_motor_ctl(enum motor_flag flag)
{
	if(flag == motor_on) {
		HAL_TIM_PWM_Start(&htim16, TIM_CHANNEL_1);
		__HAL_TIM_SET_COMPARE(&htim16, TIM_CHANNEL_1, 100);
	} else if(flag == motor_off) {
		HAL_TIM_PWM_Stop(&htim16, TIM_CHANNEL_1);
	}
}

最后需要注意的是, 以上代码你拿去肯定是不能直接使用的, 这里给大家一个参考, 大家需要结合自己的实验平台看自己的PWM外设接在哪一个定时器的输出通道上, 先去配置。

文章来源:https://blog.csdn.net/m0_74976404/article/details/135323051
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。