【51单片机学习】PWM电机调速
简单的PWM电机调速--基于51单片机
- (一)51单片机需要用到的寄存器
- (二)PWM波的产生及调速原理
- (三)电机调速的实现
(一)51单片机需要用到的寄存器
中断允许寄存器,详情可以看STC51单片机芯片手册第160页
TMOD、TCON详情可以看STC51单片机芯片手册第187页
51单片机中的定时器有三个,(C52比C51多了一个定时器3,但这些都统称为51单片机)
本次以Timer0
为例进行介绍
定时器的作用:
1:用于计时系统,可实现软件计时,或者使程序每隔一段固定的时间完成一项操作
2:替代长时间delay,提高CPU的运行效率和处理速度
因为delay延时函数会占用代码的运行空间、影响代码运行速度
通过查看芯片手册我们知道Timer0
有四种工作模式,通过配置寄存器TMOD
来选择模式
模式0:13位定时器/计数器
模式1:16位定时器/计数器
模式2:8位自动重装模式
模式3;两个8位计数器
而寄存器TCON
作用是控制定时器的启、停,标志定时器溢出和中断情况
TCON(可位寻址)用于设置定时器的控制状态
TMOD(不可位寻址)用于设置定时器的模式
这两个寄存器都分别有8位,每一位都有相应的功能
定时器0的中断触发方式,是由寄存器中TCON
中的第六位TF0
控制。当定时器计数溢出时,就会给TF0
一个标志位,单片机检测到这个标志位就会触发一次定时器中断,执行中断函数,执行完之后就会重新给标志位清零
对于51单片机定时器的详细介绍跳转连接
介绍TMOD和TCON的博客
(二)PWM波的产生及调速原理
了解PWM可以点击此处
通过调节PMW的占空比来实现对电机的速度控制,PWM的周期非常的小、其周期信号从宏观来看、电压与时间所围成面积等效于一个正弦信号,因此也可以用PWM来制作呼吸灯。
(三)电机调速的实现
51单片机的定时器每1us
计数值增加1
TH=(65536-time/(12/ft))/256
其中,time就是要延时的时间(单位:us),ft是晶振频率。这个式子又可以简化成TH=(65536-time*ft/12)/256
TL=(65536-time*ft/12)%256
首先初始化定时器,这里选择51单片机的Timer0
定时器
51定时器的计数值是分成高四位和低四位分别存放在寄存器TH
和TL
当中,因此需要分别设置TH0
和TL0
的值
特别注意
TMOD寄存器是不可位寻址的(即不能对TMOD的中的8位单独赋值),只能一次性给8位全部赋值。
void Timer0_Init()//这里以定时器0为例
{/*TMOD的低四位控制定时器00位:M01位:M12位:C/T:置0为定时器模式,置1为计数器模式3位:GATE*//* 设置定时器模式1,计数模式(16位定时器,最大值65535)*/ TMOD &=~0xFF;//所有位全部置0TMOD |=0x01;//高四位保持不变,低0位置1 /*设置定时器0.01ms中断一次*/ TH0 = 0XFF;//定时器0高位的初始值;(65536-10)/256TL0 = 0XF7;//定时器0低位的初始值;(65536-10)%256EA = 1;//使能所有中断中断ET0 = 1;//使能定时器0中断TR0 = 1;//允许定时器0开始从1开始计数,启动定时器
}
现在已经初始化好了51单片机定时器0,现在开始设置定时器中断函数
51单片机中具有一种特性,每次进入定时器中断都会将之前在初始化定时器函数
中设置的初始值清0,所以每次进入定时器中断都需要在中断函数中重新赋给定时器初始值
uint Counter,Compare;//定义两个变量,Counter用于计数(即每进入一次中断Counter+1)//Compare用于设置PWM波占空比
void Timer0_Routine() interrupt 1
{TR0=0; //赋初值时,关闭定时器TH0=0xff; //(65536-10)/256;//赋初值定时TL0=0xf7; //(65536-10)%256;//0.01msCounter++;if(Counter>100) {Counter=0; //1khz,每触发一次Counter+1,每到加到100清零//所以一个pwm周期时间为100x0.01ms=1ms}TR0=1; //打开定时器
}
现在定时器部分已经配置好了,现在开始配置一下电机,直流电机有两个接口IN1
和IN2
(这里使用TT马达为例)
其中一个接口给高电平另一个给低电平就能实现电机旋转。
/*Compare为设置电机PWM的占空比direction设置电机的正转和反转
*/
void dianji(uchar Compare,uchar direction) //定义一个电机
{ /*确保占空比在0%-100%之间*/if(Compare>100){Compare=100;}if(Compare<0){Compare=0;}/*确定电机的旋转方向*/switch(direction) //case 0正转 case 1反转{case 0:{if(Compare>Counter) //将设定的占空比和计数值进行比较{IN1=1;IN2=0;}else{IN1=0;IN2=0;}}break;case 1:{if(Compare>Counter){IN1=0;IN2=1;}else{IN1=0;IN2=0;}}break;}
}
这些程序只是简单的调速,要制作出一辆简易循迹小车还需要学习更多东西
【51单片机学习】PWM电机调速相关推荐
- 【Proteus仿真】【51单片机】PWM电机调速系统设计
文章目录 一.主要功能 二.硬件资源 三.软件设计 1.主机程序 四.实验现象 联系作者 一.主要功能 本项目使用Proteus8仿真51单片机控制器,使用L298N电机模块.数码管模块.按键模块.L ...
- STM32小车——PWM电机调速
PWM电机调速(寄存器版) 我的上一篇博客已经写了如何用定时器产生PWM来实现LED灯的呼吸灯效果,当我想实现PWM来控制电机调速时,网上翻阅了很多的资料但是大多数是在呼吸灯的基础上改一下代码实现的, ...
- 基于51单片机的L298N直流电机调速系统Proteus仿真程序
基于51单片机的L298N直流电机调速系统Proteus仿真程序 本此设计选择STC89C52单片机作为主控芯片,选取带有光电编码器的直流电机作为被控对象,利用单片机的T0定时器产生PWM信号并送到直 ...
- 树莓派Pico直流电机接口技术及PWM电机调速控制MicroPython编程
内容目录: 一.树莓派Pico开发板直流电机接口技术 1.H桥驱动电路的基本工作原理 2.典型H桥驱动电路分析 3.DRV8833双H桥电机驱动模块介绍 4.Pico开发板与直流电机接口 二.Pico ...
- pwm电机调速的原理介绍与代码实现
文章目录 1.pwm实现调速的原理与介绍 1)占空比 2)配置模式 2.pwm信号配置流程 1)设置自动重装载数值 2)设置捕获比较数值 3)设置pwm输出模式及对齐方式 4)配置信号输出极性并使能输 ...
- 关于pwm电机调速的理解
个人认为pwm调速就是某一时间有电亚,某一时间无电压 例如p10给他电压持续1ms 然后不给他电压1ms 然后一直循环然后他会一半有电压一半无电压这样他的速度就会降下来不会一直转. 其中可以用到定时器 ...
- 51单片机学习——PWM
一. PWM:脉冲宽度调调制,它是按一定规律改变脉冲序列的脉冲宽度,以调节输出量和波形的一种调制方式. 二. 我们在控制系统中最常用的矩形PWM信号,在控制时需要调节PWN波的占空比(指的是高电平持续 ...
- arduino pwm电机调速程序
void setup() { pinMode(3,OUTPUT); } void loop() { analogWrite(3,255); //设 ...
- 51单片机 PWM 直流电机调速+Proteus仿真
51单片机 PWM 电机调速+Proteus仿真 Proteus仿真 实例代码 /*用PWM控制电机脉冲频率应控制在25HZ-35HZ之间*//*定时1ms,1个周期30ms,脉冲频率为33HZ */ ...
最新文章
- SUSTechTripleH队墓志铭
- Python学习教程(Python学习视频_Python学些路线):Day05 总结和练习
- 第一方Cookie和第三方Cookie
- Linux中介绍who命令实例
- Python:初始函数
- 生信多组学整合工具的比较研究
- Struts2中的链接标签 s:url和s:a
- Storm程序的并发机制原理总结
- PMOS 和 NMOS区别
- python类属性数据三维图_Python图表属性
- 使用Java对sftp带有中文路径的文件夹进行下载,乱码打不开文件夹
- shell脚本之统计进程数(ubuntu实测可用)
- java 数据输出详解_JAVA之I/O 输入输出流详解
- 华为路由器配置静态路由默认路由
- 【Unity5】实现24小时日出日落的效果 24小时天幕系统
- AutoCAD Civil 3D-部件-部件编辑器自定义边坡与材质
- 解释程序与解释程序的缺点,图解——解释程序与编译程序的区别
- 如何查找你的IP地址?通过IP地址能直接定位到你家!
- 苹果手机Home键失灵怎么办?
- C专家编程读书笔记一:C语言晦涩难懂的声明