stm32 PWM学习专题二(直流电机驱动)

stm32 PWM学习专题二(直流电机驱动)

一、直流电机基础

1)直流电机基本原理

  • 核心结构
    1. 定子:产生固定磁场(永磁体或电磁铁)
    2. 转子(电枢):通电线圈在磁场中受力旋转
    3. 换向器与电刷:机械切换电流方向,维持转子持续转动
  • 工作原理
    1. 电磁力定律:通电导体在磁场中受力 F = BILsinθ
    2. 右手定则:确定力的方向(区分左右定则和右手螺旋定则)相关学习链接
  • 能量转换
    1. 电能 → 磁能 → 机械能
    2. 反电动势(Back EMF):转子旋转时产生

2)直流电机正反转控制

  • 方法一:切换电源极性(H桥电路)
    1. 正传 A → B
    2. 反转 B → A
  • 方法二:PWM控制(无需切换极性)
    1. 通过改变PWM占空比调整有效电压方向
    // 正转:PA8高,PB13低
    GPIO_SetBits(GPIOA, GPIO_Pin_8);  // CH1高
    GPIO_ResetBits(GPIOB, GPIO_Pin_13); // CH1N低
    
    // 反转:PA8低,PB13高
    GPIO_ResetBits(GPIOA, GPIO_Pin_8);
    GPIO_SetBits(GPIOB, GPIO_Pin_13);
    

3)直流电机停止控制

  • 自由停止(Coasting)
    1. 操作:断开电源
    2. 特点:电机惯性滑行至停止,无制动力。
  • 制动停止(Braking)
    1. 短路制动:将电机两端短接,反电动势产生阻尼。
    2. 反向电压制动:短暂施加反向电压。
    3. 特点:快速停止,但可能产生电流冲击。
    // 正转:PA8高,PB13低
    // 短路制动:PA8和PB13均输出低
    GPIO_ResetBits(GPIOA, GPIO_Pin_8);
    GPIO_ResetBits(GPIOB, GPIO_Pin_13);
    

4)直流电机调速原理

  • 方法一:通过PWM占空比控制平均电压
    特点:

    1. 低速时效率高(相比电阻调速)
    2. 需配合续流二极管保护电路
  • 方法二:调节励磁电流(仅对他励电机有效)
    原理:减弱定子磁场可升速,但扭矩降低。

  • 方法三:闭环调速(PID控制)
    传感器:编码器测速 → 反馈调整PWM占空比。

    float PID_Control(float target_rpm, float current_rpm) {
        static float integral = 0, prev_error = 0;
        float error = target_rpm - current_rpm;
        integral += error;
        float derivative = error - prev_error;
        prev_error = error;
        return Kp*error + Ki*integral + Kd*derivative; // 输出PWM占空比
    }
    

5)关键公式和注意点

  • 关键公式
    在这里插入图片描述
  • 注意点
    1. H桥保护:必须添加死区时间防止上下管直通。
    2. 反电动势处理:高速急停时可能损坏电路,需加泄放回路。
    3. 启动电流:初始电流大,可软启动(逐步增加PWM占空比)。

二、实验

1)使用PWM驱动直流电机

  • 能用单片机输出一个PWM信号,驱动电机实现正转、反转、停止,能够实现对直流电机的调速。
  • 关键代码:
    void Motor_Init(void){
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    	
    	GPIO_InitTypeDef GPIO_InitStructure;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    	
    	PWM_Init();
    }
    
    void Motor_SetSpeed(float speed){
    	if(speed >= 0 ){
    		GPIO_SetBits(GPIOA, GPIO_Pin_4);
    		GPIO_ResetBits(GPIOA, GPIO_Pin_5);
    		PWM_SetCompare3(speed);
    	}else{
    		GPIO_SetBits(GPIOA, GPIO_Pin_5);
    		GPIO_ResetBits(GPIOA, GPIO_Pin_4);
    		PWM_SetCompare3(-speed);
    	}
    	
    	if(speed == 9900){ //急停模式
    		GPIO_ResetBits(GPIOA, GPIO_Pin_5);
    		GPIO_ResetBits(GPIOA, GPIO_Pin_4);
    	}
    	if(speed == -9900){ //缓停模式
    		PWM_SetCompare3(0);
    	}
    }
    
完整代码见资源绑定

附学习参考网址

  1. STM32入门教程-2023版 细致讲解 中文字幕
  2. 左手定则、右手定则、安培定则、右手螺旋定则全搞定!_哔哩哔哩_bilibili
  3. 【windows11】鼠标光标变成白色如何解决-CSDN社区

欢迎大家有问题评论交流 (* ^ ω ^)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值