C51控制直流电机转速

木易
原创
发布时间: 2025-06-09 19:57:03 | 阅读数 0收藏数 0评论数 0
封面
使用51单片机控制电机的转速是一个常见的实验项目,通过PWM(脉冲宽度调制)技术可以实现对电机转速的有效控制。PWM是一种模拟信号电平的技术,通过改变脉冲的占空比(即高电平持续时间与周期的比例)来调节输出功率。在电机控制中,改变PWM的占空比可以直接影响电机的转速。
1

直流电机

  1. 直流电机是一种将电能转换为机械能的装置。一般的直流电机有两个电极,当电极正接时,电机正转,当电极反接时,电机反转
  2. 直流电机主要由永磁体(定子)、线圈(转子)和换向器组成
  3. 除直流电机外,常见的电机还有步进电机、舵机、无刷电机、空心杯电机等
2

电机驱动原理

直流电机是基于电磁感应原理工作的。当电流通过绕组时,会产生磁场,这个磁场与永磁体(或电磁铁)产生的固定磁场相互作用,产生旋转力矩,使电机轴转动。改变电流的方向可以改变电机的旋转方向;而改变电流的大小,则可以调节电机的转速和输出力矩。

直流电机的驱动方式

  1. 直接驱动:最简单的方式是直接将电机连接到电源上,这种方式无法精确控制电机的速度和方向。适用于对速度和方向没有严格要求的应用场景。
  2. H桥驱动:H桥电路是最常用的直流电机驱动电路之一。它由四个开关(通常是晶体管)组成,能够控制电机正转、反转、制动和自由停转四种状态。通过控制这四个开关的状态,可以灵活地改变电机的工作模式。
3

PWM及产生方法

PWM(脉宽调制)控制:PWM是一种高效的电机调速方法。它通过快速地开启和关闭电机电源来调节电机的有效电压,从而达到控制电机转速的目的。PWM信号的占空比决定了电机的实际工作时间比例,进而影响电机的平均转速。例如,50%的占空比意味着电机一半时间工作,另一半时间不工作,这样电机的平均转速就会降低。

4

创建工程

  1. 找到keil5图标并双击运行
  2. 打开后找到Project选项点击展开下拉框,选择New Project创建工程
  3. 弹出创建新工程的窗口后,在左上角选择新建一个文件夹的位置,并将文件夹命名为“LED点阵屏”。
  4. 接下来,在指定的位置双击进入“LED点阵屏”文件夹,并将新工程命名为“Project”,然后点击保存。
  5. 在随后出现的选择目标设备窗口中,搜索框内输入“AT89C52”找到对应的芯片型号,并选中它后点击 OK
  6. 系统会询问是否要添加启动文件,这里请选择“否”。
5

创建文件并修改文件工程

  1. 打开“Target1”目录,然后定位到“SourceGroup1”目录。
  2. 在“SourceGroup1”目录上右键点击,并从上下文菜单中选择“Add New Item”。
  3. 在弹出的创建新项对话框中,选择创建一个.C文件类型,并将其命名为main.c(作为主程序)。完成命名后,点击“Add”按钮来添加此文件。
  4. 双击以打开新创建的main.c文件。
  5. 在文件编辑器中,于代码部分的右侧点击右键,选择“插入”,并在光标处输入或插入#include <REGX52.h>这一行来加入所需的头文件。
  6. 接下来,导航至项目设置中的“Options for Target”。
  7. 在“Options for Target”的设置界面里,选择“Output”选项卡。
  8. 在“Output”设置中,确保“Create HEX File”选项已被勾选。完成后,点击“OK”以保存设置更改。
6

添加外部文件

  1. 下载附件文件到本地
  2. 双击"Source Group"文件,将打开一个新窗口,显示该工程下所有的文件
  3. 选中所有附件复制到"Source Group"文件夹下,并点击add
  4. 完成上述操作之后,Close关闭窗口
  5. 找到main.c文件,在头部添加"#include **.h"


文件说明

  1. Key.c: 包含独立按键相关代码,用于处理按键输入和去抖动。
  2. Delay.c: 提供延迟函数,用于实现简单的延时功能。
  3. Nixie.c: 包含数码管相关代码,用于控制数码管的显示和设置。
  4. Timer0.c: 实现基于定时器0的中断代码,用于精确的时间测量和周期性事件触发。


H
Key.h
72B
H
Delay.h
85B
C
Nixie.c
841B
C
Key.c
527B
H
Nixie.h
98B
C
Timer0.c
636B
H
Timer0.h
81B
C
Delay.c
153B
7

编写代码

#include <REGX52.H> // 包含51单片机寄存器定义头文件
#include "Delay.h" // 延时函数头文件
#include "Key.h" // 按键处理头文件
#include "Nixie.h" // 数码管显示头文件
#include "Timer0.h" // 定时器0初始化及中断处理头文件

sbit Motor = P1^0; // 定义电机控制引脚为P1.0

unsigned char Counter, Compare; // 计数值和比较值,用于输出PWM信号
unsigned char KeyNum, Speed; // 按键编号和速度等级变量

void main() // 主函数
{
Timer0_Init(); // 初始化定时器0
while (1) // 无限循环
{
KeyNum = Key(); // 获取当前按键状态
if (KeyNum == 1) // 如果检测到按键1被按下
{
Speed++; // 速度等级加1
Speed %= 4; // 速度等级取模4,确保Speed在0-3之间循环
switch (Speed) // 根据Speed设置不同的PWM占空比
{
case 0: Compare = 0; break; // 速度0对应PWM占空比0%
case 1: Compare = 50; break; // 速度1对应PWM占空比50%
case 2: Compare = 75; break; // 速度2对应PWM占空比75%
case 3: Compare = 100; break;// 速度3对应PWM占空比100%
}
}
Nixie(1, Speed); // 在数码管上显示当前速度等级
}
}

void Timer0_Routine() interrupt 1 // 定时器0中断服务程序
{
TL0 = 0x9C; // 重装载定时器0低8位计数初值
TH0 = 0xFF; // 重装载定时器0高8位计数初值
Counter++; // 计数值加1
Counter %= 100; // 计数值取模100,确保在0-99之间循环
if (Counter < Compare) // 如果计数值小于比较值
{
Motor = 1; // 输出高电平,电机工作
}
else // 如果计数值大于或等于比较值
{
Motor = 0; // 输出低电平,电机停止
}
}
阅读记录0
点赞0
收藏0
禁止 本文未经作者允许授权,禁止转载
猜你喜欢
评论/提问(已发布 0 条)
评论 评论
收藏 收藏
分享 分享
pdf下载 下载