直流电机控制(PWM)+普中51单片机+江科大自化协
1 实验现象

2 实验原理


通过按键来控制PWM占空比实现对直流电机的调速,数码管则显示当前速度挡位信息。
(1)直流电机的控制是通过设置PWM波的占空比来控制直流电机的转速,占空比越大,转速越快,越小转速越低;
(2)单片机的I/O口是不能直接驱动电机的,所以还需要用一个驱动芯片。如 LG9110、CMO825、L298 等。驱动芯片可以将单片机I/O输出信号放大,这样电机中流过的电流足够大,电机才能转起来。
(3)直流电机只有两根电源线,直流电机的两根电源线是不分正负极的。假设两根电源线代号分别为A、B。 当A线接正极,B线接负极时,电机正转(反转);那么当B线接正极,A线接负极时,电机反转(正转)。

3 参考程序
3.1 主程序
#include <REGX52.H>
#include "delayms.h"
#include "key.h"
#include "Nixie.h"
#include "timer0.h" sbit Motor=P1^3; //直流电机,高电平驱动 unsigned char Counter,Compare; //计数值和比较值,用于输出PWM
unsigned char KeyNum,Speed; void main()
{
timer0_init();
while(1)
{
KeyNum=key();
if(KeyNum==1)
{
Speed++;
Speed%=4; //计数值计算范围为0-3
if(Speed==0) {Compare=0;}
if(Speed==1) {Compare=50;}
if(Speed==2) {Compare=75;}
if(Speed==3) {Compare=100;}
}
Nixie(1,Speed);
}
} void Timer0_Routine() interrupt 1
{
TL0 = 0xAE; //设置定时初始值,100us,@11.0592MHz
TH0 = 0xFB; //设置定时初始值,100us,@11.0592MHz
Counter++;
Counter%=100; //计数值计算范围为0-99
if(Counter<Compare) //计数值小于比较值
{
Motor=1; //高电平驱动,电机转动
}
else
{
Motor=0; //电机停止
}
}
3.2 延时函数
#include <intrins.h> void delayms(unsigned int xms) //@11.0592MHz
{
unsigned char i, j; while(xms--)
{
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
}
#ifndef _delayms_h_
#define _delayms_h_ delayms(unsigned int xms); #endif
3.3 按键扫描函数
#include <reg52.h>
#include "delayms.h" sbit key1 = P3^1;
sbit key2 = P3^0;
sbit key3 = P3^2;
sbit key4 = P3^3; /**
* @brief 获取独立按键键码
* @param 无
* @retval 按下按键的键码,范围:0~4,无按键按下时返回值为0
*/ unsigned char key()
{
unsigned char KeyNumber = 0;
if(key1==0){delayms(20);while(key1==0);delayms(20);KeyNumber=1;}
if(key2==0){delayms(20);while(key2==0);delayms(20);KeyNumber=2;}
if(key3==0){delayms(20);while(key3==0);delayms(20);KeyNumber=3;}
if(key4==0){delayms(20);while(key4==0);delayms(20);KeyNumber=4;}
return KeyNumber;
}
#ifndef _key_h_
#define _key_h_ unsigned char key(); #endif
3.4 数码管扫描函数
#include <REGX52.H>
#include "delayms.h" sbit HC138_A=P2^2;
sbit HC138_B=P2^3;
sbit HC138_C=P2^4; //数码管段码表,0-9
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; /**
* @brief 数码管显示
* @param Location 要显示的位置,范围:1~8
* @param Number 要显示的数字,范围:段码表索引范围
* @retval 无
*/
void Nixie(unsigned char Location,Number)
{
switch(Location) //位码输出
{
case 1:HC138_C=1;HC138_B=1;HC138_A=1;break;
case 2:HC138_C=1;HC138_B=1;HC138_A=0;break;
case 3:HC138_C=1;HC138_B=0;HC138_A=1;break;
case 4:HC138_C=1;HC138_B=0;HC138_A=0;break;
case 5:HC138_C=0;HC138_B=1;HC138_A=1;break;
case 6:HC138_C=0;HC138_B=1;HC138_A=0;break;
case 7:HC138_C=0;HC138_B=0;HC138_A=1;break;
case 8:HC138_C=0;HC138_B=0;HC138_A=0;break;
}
P0=NixieTable[Number]; //段码输出
delayms(1); //显示一段时间
P0=0x00; //段码清0,消影
}
#ifndef __NIXIE_H__
#define __NIXIE_H__ void Nixie(unsigned char Location,Number); #endif
3.5 定时器函数
#include <REGX52.H> /**
* @brief 定时器0初始化,100微秒@11.0592MHz
* @param 无
* @retval 无
*/
void timer0_init(void) //100微秒@11.0592MHz
{
TMOD &= 0xF0; //设置定时器模式,1111_0000,&,高四位保留,低四位清零
TMOD |= 0x01; //设置定时器模式,0000_0001,|,高四位保留,设置模式为T0
TL0 = 0xAE; //设置定时初始值,100us,@11.0592MHz
TH0 = 0xFB; //设置定时初始值,100us,@11.0592MHz
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1; //打开定时器T0中断开关
EA=1; //打开中断系统总开关
PT0=0; //设置T0中断优先级,低
} /*定时器中断函数模板
void Timer0_Routine() interrupt 1
{
static unsigned int T0Count;
TL0 = 0x66; //设置定时初值,1毫秒@11.0592MHz
TH0 = 0xFC; //设置定时初值,1毫秒@11.0592MHz
T0Count++;
if(T0Count>=1000)
{
T0Count=0; }
}
*/
#ifndef _timer0_h_
#define _timer0_h_ void timer0_init(void); #endif
4 参考资料
直流电机控制(PWM)+普中51单片机+江科大自化协的更多相关文章
- 51单片机外部中断INT0实例(汇编程序)
;普中51开发板 ;单片机的P3.2(INT0)引脚与按键K3脚连接 ;用汇编语言实现:按一次K1外部中断INT0响应一次,LED显示值加1(十进制), ;前提是共阴数码LED第一位,需要设定,由P0 ...
- 【零基础】彻底搞懂51单片机各种型号(ATMEL系列)
零.前言 初学者开始学习51单片机时往往先是一愣,说好51单片机啊,咋个型号是AT89C52,这个S52又是咋回事?上学的时候大都懵懵懂懂就这么用着,但始终没整明白,所以今天我们就彻底搞明白这些“51 ...
- 51单片机—使用PWM对直流电机调速
文章目录 - 什么是PWM - PWM是怎么对直流电机进行调速的 - 通过定时器中断实现PWM调速 - 上代码 - 什么是PWM PWM(脉宽调制),是靠改变脉冲宽度来控制输出电压,通过改变周期来控制 ...
- 51单片机-独立按键控制led矩阵的左移和右移
51单片机学习 独立按键 控制led灯光矩阵的左移和右移 开发板采用的是普中的A2学习开发板,具体的代码如下: typedef unsigned int u16; void delay(u16 tim ...
- sprintf在51单片机中的使用
sprintf在51单片机中的使用 unsigned char ch20_str[4]; unsigned char ch2o_m_str[6]; ch2o = 123; ch2o_m = 23456 ...
- 51单片机引脚ALE/PROG/PSEN/EA/Vpp
51单片机的4个控制引脚,其中一个引脚是复位引脚(RST/Vpd),RST是复位引脚,当RST输入端保持2个机器周期以上高电平时,就实现复位. ALE/PROG是地址锁存允许信号输出端,在读写外部存储 ...
- 51单片机实现对24C02进行页写、顺序读取并显示验证
//************************************************************************************* //**程序名称:51单 ...
- STM32GPIO口8种模式细致分析(类比51单片机)
关于STM32GPIO口的8种工作模式,我们先引出一些问题? STM32GPIO口如果既要输入又要输出怎么办? 1.浮空输入模式 上图红色的表示便是浮空输入的过程,外部输入时0读出的就是0,外部输入时 ...
- 基于51单片机IIC通信的PCF8591学习笔记
引言 PCF8591 是单电源,低功耗8 位CMOS 数据采集器件,具有4 个模拟输入.一个输出和一个串行I2C 总线接口.3 个地址引脚A0.A1 和A2 用于编程硬件地址,允许将最多8 个器件连接 ...
- [学习笔记]15个QA让你快速入门51单片机开发
一.C语言相关 Q1:sbit与sfr代表是什么?有什么作用? Q2:#define OSC_FREQ 22118400L这句宏命令里的“L”是什么意思? Q3:我粘贴了别人的代码,怎么发现没有un ...
随机推荐
- NOI2024破防记/rain
NOI 2024 预警:在本篇游记中,你将看到包括但不限于 诶我好高兴,诶我破防了,诶我好高兴,诶我破防了,诶我好高兴,诶我破防了,诶我好高兴,诶我破防了,诶我好高兴,诶我破防了,诶我好高兴,诶我破防 ...
- 【闲话 No.4】 wqs 二分
你呀你呀 很好听的派蒙歌,6.1 要备战期末没法放歌所以在 5 月底放了每日一歌,希望可以让大家开心一些,也希望派蒙生日快乐! 你呀你呀 快给我休息一下 长了颗痘又 掉了好几根头发 怎么不说话 是不是 ...
- C# DateTime时间戳帮助类型
https://www.cnblogs.com/minotauros/p/10773258.html /// <summary> /// 时间工具类 /// </summary> ...
- SQL Server 部分包含数据库的原理
原文链接:https://blog.csdn.net/zhoujunah/java/article/details/103513426 包含是针对数据库独立性而来的,非包含数据库(SQL Server ...
- vitepress动态导航
前言 我需要根据动态设置导航. 比如根据不同的路由设置不同的顶部导航. 但是vitepress并没有相关配置,但是我们可以通过拦截主题修改全局状态来完成这个功能! 核心知识 创建文件,xxx/docs ...
- windows11安装linux
安装教程 https://blog.csdn.net/Daisy74RJ/article/details/125483629 可能遇到的问题 如果报错 则参考 WslRegisterDistribut ...
- 使用类似于raspberry的方式登录ubuntu20.04--vnc
简介 我看过最好的教程是 https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-vnc-on-ub ...
- Almost Isometric Mesh Parameterization through Abstract Domains
简介 上一篇论文中的参数化没看懂看看相关的论文. 介绍 我们对于一个好的参数化被描述为 低扭曲的.保持角度和保持面积. 低复杂度的. TODO
- java 学习ing
简介 正式开始重新开始学java 第一个程序一般是hello World 废话不多说开始吧 code public class Welcome1 { public static void main(S ...
- Arduino ESP8266 开发环境搭建
Arduino ESP8266 开发环境搭建 很久之前学嵌入式时,用过Arduino+8266进行开发,开发成本低.难度小,体验很不错. 近期,又突然要用,遂再次搭建环境,但变动挺多,有些小波折,开贴 ...