51单片机pwm调速实现pwm对电机调速

用89c51单片机输出pwm波形来改变电机转速的程序_百度知道
用89c51单片机输出pwm波形来改变电机转速的程序
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
采用pwm啊,就是在固定周期里高电平与低电平占的比例,例如周期为1s,高电平占0.7s低电平占0.3,如果高电平占的时间越长速度就越快啊#include “reg51.h”#define T 10
//T为周期#define
//0&=t&=10
t越大越快sbit p0_0 = P0^0;Delay(int t){int i;
while(t--)for(i = 0;i & 123;i++);}main(){
for(i = 0; i & 500;i++){
Delay(T-t);}}
用定时器怎么用呢?
#include&reg52.h& //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #define uchar unsigned char #define uint unsigned int #define T 10
//T=10ms为周期 #define
//0&=t&=10
t越大越快 sbit p0_0 = P0^0; uint t = 0;/*------------------------------------------------
定时器初始化子程序------------------------------------------------*/void Init_Timer1(void){ TMOD |= 0x10;
//使用模式1,16位定时器,使用&|&符号可以在使用多个定时器时不受影响
TH1=()/256;
//给定初值,这里使用定时器最大值从0开始计数一直到65535溢出 TL1=()%256;
//定时20微秒 EA=1;
//总中断打开 ET1=1;
//定时器中断打开// TR1=1;
//定时器开关打开}main(){ Init_Timer1(); while(1);{ p0_0 = 1; TR1=1; while(t &= (t1*50*20)); //延时t1毫秒 TR1=0;//定时器关掉 t = 0; p0_0 = 0; TR1=1; while(t &= ((T-t1)*50*20));//延时T-t1毫秒 TR1=0;//定时器关掉 t = 0;
}}/*------------------------------------------------
定时器中断子程序------------------------------------------------*/void Timer1_isr(void) interrupt 3 using 1{ TH1=()/256;
TL1=()%256; t++;}
采纳率:36%
为您推荐:
其他类似问题
pwm波形的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。文章 - 0&评论 - 1&trackbacks - 0
直流电动机的PWM调压调速原理
直流电动机转速N的表达式为:N=U-IR/K&
由上式可得,直流电动机的转速控制方法可分为两类:调节励磁磁通的励磁控制方法和调节电枢电压的电枢控制方法。其中励磁控制方法在低速时受磁极饱和的限制,在高速时受换向火花和换向器结构强度的限制,并且励磁线圈电感较大,动态响应较差,所以这种控制方法用得很少。现在,大多数应用场合都使用电枢控制方法。
对电动机的驱动离不开半导体功率器件。在对直流电动机电枢电压的控制和驱动中,对半导体器件的使用上又可分为两种方式:线性放大驱动方式和开关驱动方式。
线性放大驱动方式是使半导体功率器件工作在线性区。这种方式的优点是:控制原理简单,输出波动小,线性好,对邻近电路干扰小;但是功率器件在线性区工作时由于产生热量会消耗大部分电功率,效率和散热问题严重,因此这种方式只用于微小功率直流电动机的驱动。绝大多数直流电动机采用开关驱动方式。开关驱动方式是使半导体器件工作在开关状态,通过脉宽调制PWM来控制电动机电枢电压,实现调速。
在PWM调速时,占空比&是一个重要参数。以下3种方法都可以改变占空比的值。
(1)定宽调频法
这种方法是保持t1不变,只改变t2,这样使周期T(或频率)也随之改变。
(2)调频调宽法
这种方法是保持t2不变,只改变t1,这样使周期T(或频率)也随之改变。
(3)定频调宽法
这种方法是使周期T(或频率)保持不变,而同时改变t1和t2。
前两种方法由于在调速时改变了控制脉冲的周期(或频率),当控制脉冲的频率与系统的固有频率接近时,将会引起振荡,因此这两种方法用得很少。目前,在直流电动机的控制中,主要使用定频调宽法。
直流电动机双极性驱动可逆PWM控制系统
双极性驱动则是指在一个PWM周期里,作为在电枢两端的脉冲电压是正负交替的。
双极性驱动电路有两种,一种称为T型,它由两个开关管组成,采用正负电源,相当于两个不可逆控制系统的组合。但由于T型双极性驱动中的开关管要承受较高的反向电压,因此只用在低压小功率直流电动机驱动。
另一种称为H型。
H型双极性驱动
1.&&电动机控制电路模块
H桥电动机驱动电路的工作原理:
A:当单片机的P0.0脚输出高电平,而P0.1脚输出低电平时,通过光电耦合器后仍然输出为高电平,使Q4管导通,此时Q1也处于导通状态,但Q2管的基极的电位被强行拉低,Q2管处于截止状态。由于单片机的P0.1脚输出低电平,
Q8处于截止状态,而此时Q7因为Q5的截止而处于导通状态,从而使电动机形成回路,电机正常工作。
B:同理可得,当P0.0脚输出低电平,而P0.1脚输出高电平时,三极管的状态与上述相反,电机同样处于正常工作状态。
C:当P0.0脚和P0.1同时为高电平或低电平,由于Q4与Q8和Q3与Q7的工作状态相同,同时处于导通或截止,使电机两断电位相同,无法使电机形成闭和回路,电机不工作,着就是所谓本设计所提及的刹车状态。
由于电路中在驱动功率管的发射极各添加了一个小电感,目的是为了使电机驱动电压更加稳定,得到较为平滑的驱动电压,从而增加了刹车时动作的准确性,减少电机的在起动和停止的瞬间产生过大的电压对功率管的冲击,导致功率管的损坏。同时也提高了电机的刹车控制可靠性和准确性,不至于因惯性而导致控制上产生较大的误差。
该桥的优点是电路的原理简单、易控制、功耗低带负载能力强、刹车的精度很高而且价格低廉。在驱动电路的控制信号输入断采用了光电隔离技术,减小H桥电机驱动电路对单片机的干扰,实现模拟电路与数字电路的隔离。在单片机的配合下,通过PWM调节脉宽的方法,实现了对驱动电机的轻松调速,通过键盘的配置可以对体的参数进行修改,可以使电机适应各种不同的工作状态,而实现智能控制的目的。正因为采取了PWM该技术,使我们完成基本要求的过程变得简单易行。
在电路中所采取的功率管为中功率管,其中将驱动功率管设计为灵活替换方式,可以根据实际驱动电路的需要,从而调整功率管的型号而不用另行更改电路,就可以满足电路控制的要求
2、软件模块部分
在速度控制方面,一般是能通过改变加在电机两端的电压来实现的,可以是连续改变(加直流电压),也可以是断续改变(加脉冲电压)。为了简单用,我们采用了脉宽调速,脉宽的变化可以通过硬件或软件来实现。
方案一&&& 硬件实现是通过改变振荡电路中RC参数来调整充放电时间。若用硬件电路来实现,在稳定性方面得不到保证。
方案三&&& 用软件的作法是通过设置高电平及低电平的保持时间来达到PWM的脉宽调制目的。
就比较而言,软件调整量化指标更高、调整更可靠、更方便、更准确。因此在设计时,常考虑方案二。
脉冲频率对电机转机也有影响,脉冲频率高连续性好,但带负载能力差,频率低则反之。经实验发现,脉冲频率在15━20HZ效果最佳。在本设计中采用了20HZ进行设计。
脉冲调速实质上是调节加在电机两端的平均功率,通过计算可发现电机的速度与脉宽成正比。
软件编程的考虑是设置脉宽这个变量。在P0.0,P0.1的输出控制信号来产生20HZ可调脉宽方波。
下面是51单片机的实验程序
#include & reg51.h &
#include & intrins.h &
K1 =P1^4 ;
K2 =P1^5 ;
P00 =P0^1;
BEEP =P3^7 ;
unsigned char PWM=0xe7;
void Beep();
void delayms(unsigned char ms);
void delay(unsigned char t);
/*********************************************************/
void main()
TMOD=0x21 ;
//50us延时常数
//频率调节
//脉宽调节
if(PWM!=0xff)
{PWM++ ;delayms(10);}
else Beep() ;
while(K1==0);
if(PWM!=0xce)
{PWM-- ;delayms(10);}
else Beep() ;
while(K2==0);
void timer0() interrupt 1
//启动输出
void timer1() interrupt 3
//结束输出
/*********************************************************/
//蜂鸣器子程序
/*********************************************************/
void Beep()
for (i=0i&100i++)
delay(100)
BEEP=!BEEP
//Beep取反
//关闭蜂鸣器
delayms(100);
/*********************************************************/
// 延时子程序
/*********************************************************/
void delay(unsigned char t)
while(t--)
/*********************************************************/
// 延时子程序
/*********************************************************/
void delayms(unsigned char ms)
while(ms--)
for(i = 0 ; i & 120 ; i++) ;
/*********************************************************/
阅读(...) 评论()基于51单片机的PWM直流电机调速报告_图文_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
基于51单片机的PWM直流电机调速报告
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩18页未读,
定制HR最喜欢的简历
你可能喜欢查看: 1616|回复: 1
基于51单片机PWM直流电机调速程序 0到20级的调速
前段时间无聊写的一段小程序,供大家参考。
0.png (65.96 KB, 下载次数: 31)
02:08 上传
单片机源程序:
/*******************************************************************/
/* 程序名:PWM直流电机调速 */
/* 晶振:11.00592 MHz CPU型号:AT89C51 */
/* 直流电机的PWM波控制,可以直接的调速从0到20级的调速 */
/*****************************************************************/
#include&reg51.h&
#define TH0_TL0 ()//设定中断的间隔时长
unsigned char count0 = 50;//低电平的占空比
unsigned char count1 = 0;//高电平的占空比
bit Flag = 1;//电机正反转标志位,1正转,0反转
sbit Key_add=P2 ^ 0; //电机减速
sbit Key_dec=P2 ^ 1; //电机加速
sbit Key_turn=P2 ^ 2; //电机换向
sbit PWM1=P2^6;//PWM 通道 1,反转脉冲
sbit PWM2=P2^7;//PWM 通道 2,正转脉冲
unsigned char Time_
/************函数声明**************/
void Delay(unsigned char x);
void Motor_speed_high(void);
void Motor_speed_low(void);
void Motor_turn(void);
void Timer0_init(void);
/****************延时处理**********************/
void Delay(unsigned char x)
{
& & & & Time_delay =
& & & & while(Time_delay != 0);//等待中断,可减少PWM输出时间间隔
}
/*******按键处理加pwm占空比,电机加速**********/
void Motor_speed_high(void)
{
& & & & if(Key_add==0)
& & & & {
& & & && && & & & Delay(10);
& & & && && & & & if(Key_add==0)
&&& & & & & & & & {
& & & & & & & & & & count0 += 5;
&&
& & & & & & & & & & if(count0 &= 100)
& & & & & & & & & & {
& & & & & & & & & & & & & & count0 = 100;
& & & & & & & & & & }
&&& & & & & & & & }
&&& & & & & & & & while(!Key_add);//等待键松开
& & & & }
}
/******按键处理减pwm占空比,电机减速*****/
void Motor_speed_low(void)
{
& & & & if(Key_dec==0)
& & & & {
&&& & & & & & & & Delay(10);
&&& & & & & & & & if(Key_dec==0)
&&& & & & {
& & & & & & count0 -= 5;
&&
& & & & & & if(count0 &= 0)
& & & & & & {
& & & & & & & & & & count0 = 0;
& & & & & & }
&&& & & & }
&&& & & & while(!Key_dec );
& & & & }
/************电机正反向控制**************/
void Motor_turn(void)
{
& & & & if(Key_turn == 0)
& & & & {
& & & && &Delay(10);
& & & && &if(Key_turn == 0)
&&& & & & {
& & & & & & Flag = ~F
&&& & & & }
& & & &&&while(!Key_turn);
& & & & }
}
/***********定时器0初始化***********/
void Timer0_init(void)
{
TMOD=0x01; //定时器0工作于方式1
TH0=TH0_TL0/256;
TL0=TH0_TL0%256;
TR0=1;
ET0=1;
EA=1;
}
/*********主函数********************/
void main(void)
{
& & & & Timer0_init();
& & & & while(1)
& & & & {
& & & && &Motor_turn();
& & & && &Motor_speed_high();
& & & && &Motor_speed_low();
& & & & }
}
/**************定时0中断处理******************/
void Timer0_int(void) interrupt 1 using 1
{
TR0 = 0;//设置定时器初值期间,关闭定时器
TL0 = TH0_TL0 % 256;
TH0 = TH0_TL0 / 256 ;//定时器装初值
TR0 = 1;
if(Time_delay != 0)//延时函数用
{
&&Time_delay--;
if(Flag == 1)//电机正转
{
&&PWM1 = 0;
&&
&&if(++count1 & count0)
&&{
& & PWM2 = 1;
&&}
& & else
& & PWM2 = 0;
& & if(count1 &= 100)
& & {
& & count1=0;
& & }
}
&&else //电机反转
&&{
& & PWM2 = 0;
&&
& & if(++count1 & count0)
& & {
& & PWM1 = 1;
& & }
& & else
& & PWM1 = 0;
& &
& & if(count1 &= 100)
& & {
& && &count1=0;
& & }
&&}
}
/************************************************
void Delay(unsigned char x)
{
Time_delay =
while(Time_delay != 0);//等待中断,可减少PWM输出时间间隔
}
Delay(10);
if(Time_delay != 0)//延时函数用
{
&&Time_delay--;
其实这三个部分是相关联的。
Delay(10)这是延时防抖的这是毫无疑问的,但这个消抖在消抖的同时将一开始只是声明了下的Time-
delay赋值了,赋值还不算他还牵扯到定时器里去了。你看在赋值后Time-delay变成了10,看第二个部分
的while(Time-delay!=10);这个语句正如注释所说的等待中断,当等来了中断后你可以看第三个部
分了,看见了吧终端中有将Time-delay减一,每中断一次就减一次直到等于0之后。也就是说延时的时长
是十个中断的时长。注释中:可减少PWM输出时间间隔& && &也就可想而知了。
*****************************************************/复制代码
(59.08 KB, 下载次数: 22)
11:17 上传
点击文件名下载附件
下载积分: 黑币 -5
共享资料的黑币奖励!
挺好的,下载来学习一下,辛苦楼主了
无效楼层,该帖已经被删除
Powered by网站已改版,请使用新地址访问:
PWM 51单片机利用L298N芯片驱动直流电机,通过按键PWM调速。 SCM 开发 238万源代码下载- www.pudn.com
&文件名称: PWM
& & & & &&]
&&所属分类:
&&开发工具: C#
&&文件大小: 20 KB
&&上传时间:
&&下载次数: 0
&&提 供 者:
&详细说明:51单片机利用L298N芯片驱动直流电机,通过按键PWM调速。-51 use L298N chip microcontroller drive DC motor PWM speed control via buttons.
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&PWM\PWM&&...\PWM.c&&...\PWM.hex&&...\PWM.lnp&&...\PWM.LST&&...\PWM.M51&&...\PWM.OBJ&&...\PWM.Opt&&...\PWM.plg&&...\PWM.Uv2&&...\PWM_Opt.Bak&&...\PWM_Uv2.Bak&&...\STARTUP.A51&&...\STARTUP.LST&&...\STARTUP.OBJ&&...\Text1.LST&&...\Text1.OBJ&&PWM
&输入关键字,在本站238万海量源码库中尽情搜索:

我要回帖

更多关于 单片机pwm占空比调速 的文章

 

随机推荐