51单片机控制直流电机PWM调速C语言程序
51单片机C源代码直流电机
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void Time1Config()
*******************************************************************************/
void Time1(void) interrupt 3 //3 为定时器1的中断号 1 定时器0的中断号 0 外部中断1 2 外部中断2 4 串口中断
{
TH1 = 0xFE; //重新赋初值
TL1 = 0x0C;
timer1++;
}
#include <reg52.h>
//--定义使用的IO口--//
sbit PWM=P1^0;
//--定义一个全局变量--//
unsigned char timer1;
void Time1Config();
/*******************************************************************************
}
/*******************************************************************************
* 函 数 名 : Time1
* 函数功能 : 定时器1的中断函数
* 输 入 : 无
* 输 出 : 无
{
基于51单片机的PWM直流电机调速报告
课程名称:微机原理课程设计题目:基于51单片机的PWM直流电机调速直流电机脉冲宽度调制(Pulse Width Modulation-简称PWM)调速产生于20世纪70 年代中期,最早用于自动跟踪天文望远镜、自动记录仪表等的驱动,后来由于晶体管器件水平的提高及电路技术的发展, PWM 技术得到了高速发展,各式各样的脉宽调速控制器,脉宽调速模块也应运而生,许多单片机也都有了PWM输出功能。
而51单片机却没有PWM 输出功能,采用定时器配合软件的方法可以实现51单片机PWM的输出功能。
本设计就是由单片机STC89C52RC芯片,直流电机(搭建H桥电路驱动)和四位一体LED数码管为核心,辅以必要的电路,构成了一个基于51单片机PWM可调速的直流电机。
该可调直流电机具有良好的起动、制动性能,宜于在大范围内平滑调速,在许多需要调速或快速正反向的电力拖动领域中得到了广泛的应用。
该可调直流电机布置合理,全部器件分布在7*9cm洞洞板上,看起来小巧精简。
采用的是单片机内部定时器产生方波并且两个P口交换输出,可以方便灵活地调速度和方向。
该可调直流电机从0到最大速度1200转每分钟一共设置了60个档次的转速,采用红光四位数码管,可以直观地显示出来(显示的是每分钟的转速)。
有红光和绿光的两个二极管作为转速指示灯。
四个控制按键就可以控制电机的转速,方向与暂停。
每按一个键,该可调电机就会实现相对应的功能,操作非常简单。
关键词:直流电机,51单片机,C语言,数码管一、设计任务与要求 (4)1.1 设计任务 (4)1.2 设计要求 (4)二、方案总体设计 (5)2.1 方案一 (5)2.2 方案二 (5)2.3 系统采用方案 (5)三、硬件设计 (7)3.1 单片机最小系统 (7)3.2 数码管显示模块 (7)3.3 系统电源 (8)3.4驱动电路 (8)3.5 整体电路 (9)四、软件设计 (10)4.1 keil软件介绍 (10)4.2 系统程序流程 (10)五、仿真与实现 (13)5.1 proteus软件介绍 (13)5.2 仿真过程 (13)5.3 实物制作与调试 (15)5.4 使用说明 (17)六、总结 (18)6.1 设计总结 (18)6.2 经验总结 (18)七、参考文献 (21)一、设计任务与要求1.1 设计任务1).对更多小器件的了解2).巩固51单片机和C语言的知识,熟悉单片机和C语言的实际操作运用3).掌握仿真软件的运用和原理图的绘制4).加深焊接的技巧,提高焊接的能力5).熟悉调试方法和技巧,提高解决实际问题的能力6).熟悉设计报告的编写过程1.2 设计要求1).四个按键分别实现改变转向,加速,减速与暂停的功能2).H桥电路驱动直流电机3).一个红光和一个绿光二级管指示电机转向4).四位数码管显示转速二、方案总体设计设计一个基于51单片机的可调直流电机。
51单片机控制直流电机PWM调速
51单片机控制直流电机PWM调速
实验目的
1.掌握脉宽调制(PWM) 的方法。
2.用程序实现脉宽调制,并对直流电机进行调速控制。
实验设备
PC 机一台,单片机最小系统,驱动板、直流电机,连接导线等
实验原理
1.PWM (Pulse Width Modulation) 简称脉宽调制。
即,通过改变输出脉冲
的占空比,实现对直流电机进行调压调速控制。
2.实验线路图:
实验内容:
1. 利用实验室提供的单片机应用系统及直流电机驱动电路板,编制控制程序,实现直流电机PWM调速控制。
实验思考题
本实验中是通过改变脉冲的占空比,周期T 不变的方法来改变电机转速的,还有什么办法能改变电机的转速,应该怎么实现?
附件:
L298简介:
L298N 为SGS-THOMSON Microelectronics 所出产的双全桥步进电机专用驱动芯片( Dual Full-Bridge Driver ) ,内部包含4信道逻辑驱动电路,是一种二相和四相步进电机的专用驱动器,可同时驱动2个二相或1个四相步进电机,内含二个H-Bridge 的高电压、大电流双全桥式驱动器,接收标准TTL逻辑准位信号,可驱动46V、2A以下的步进电机,且可以直接透过电源来调节输出电压;此芯片可直接由单片机的IO端口来提供模拟时序信号。
基于C51单片机的直流电机PWM调速控制(包含原理图及C源代码)
基于C51单片机的直流电机PWM调速控制--SQ这是最近一阶段自己学习所获,现分享与大家。
这里采用A T89C52单片机做主控制芯片,实现两路直流电机的PWM调速控制,另外还可以实现转向、显示运行时间、显示档位等注:考虑小直流电机自身因素,调速范围仅设有四级电路原理图:C语言程序源代码:/******************** 硬件资源分配*********************/数码管:显示电机状态(启停、正反、速度)、运行时间、是否转弯按键:K4 启动/暂停K3 正反转/转弯允许K2 加速/左转/运行时间清零K1 减速/右转/停止定时器:T0 数码管动态显示,输出PWMT1 运行时间记录********************************************************//*******主程序文件PWM.c******/#include <reg52.h>#include "Afx.h"#include "Config.c"#define CIRCLE 5 //脉冲周期//按键定义uchar key,key_tmp=0, _key_tmp=0;//显示定义uchar LedState=0xF0; //LED显示标志,0xF0不显示,Ox00显示uchar code LED_code_d[4]={0xe0,0xd0,0xb0,0x70}; //分别选通1、2、3、4位uchar dispbuf[4]={0,0,0,0}; //待显示数组uchar dispbitcnt=0; //选通、显示的位uchar mstcnt=0;uchar Centi_s=0,Sec=0,Min=0; //分、秒、1%秒//程序运行状态标志bit MotState=0; //电机启停标志bit DirState=0; //方向标志0前,1后uchar State1=-1;uchar State2=-1;uchar State3=0;uchar State4=-1;uchar LSpeed=0;uchar RSpeed=0;//其他uint RunTime=0;uint RTime_cnt=0;uint LWidth;uint RWidth; //脉宽uint Widcnt=1;uint Dispcnt;//函数声明void key_scan(void);void DisBuf(void);void K4(void);void K3(void);void K2(void);void K1(void);void disp( uchar H, uchar n );void main(void){P1|=0xF0;EA=1;ET0=1;ET1=1;TMOD=0x11;TH0=0xFC;TL0=0x66; //T0,1ms定时初值TH1=0xDB;TL1=0xFF; //T1,10ms定时初值TR0=1;Widcnt=1;while(1){key_scan();switch(key){case 0x80: K1(); break;case 0x40: K2(); break;case 0x20: K3(); break;case 0x10: K4(); break;default:break;}key=0;DisBuf();LWidth=LSpeed;RWidth=RSpeed;}}//按键扫描**模拟触发器防抖void key_scan(void){key_tmp=(~P3)&0xf0;if(key_tmp&&!_key_tmp) //有键按下{key=(~P3)&0xf0;}_key_tmp=key_tmp ;}//按键功能处理/逻辑控制void K4(void){if(State4==-1){State4=1;TR1=1;dispbuf[3]=1;LedState=0x00; //打开LEDMotState=1; //打开电机LSpeed=1;RSpeed=1; //初速设为1}else if(State4==1){State4=0;TR1=0;MotState=0; //关闭电机}else if(State4==0){MotState=1;if(State3==0){State4=1;TR1=1;}else if(State3==1){LSpeed=2;RSpeed=2;}}}void K3(void){if(State4==1)DirState=!DirState;if(State4==0){if(State3==0){State3=1; //可以转向标志1可以,0不可以TR1=1;dispbuf[3]=9;MotState=1;LSpeed=2;RSpeed=2;}else if(State3==1){State3=0;TR1=0;dispbuf[3]=0;MotState=0;}}}void K2(void){if(State4==1&&LSpeed<4&&RSpeed<4){LSpeed++;RSpeed++;}else if(State4==0){if(State3==0){//State4=-1;//LedState=0xF0;MotState=0;Sec=0;Min=0;}else if(State3==1&&LSpeed<4&&RSpeed<4){//TurnState=0;LSpeed=2;RSpeed++;}}}void K1(void){if(State4==1&&LSpeed>1&&RSpeed>1){LSpeed--;RSpeed--;}else if(State4==0){if(State3==0){State4=-1;LedState=0xF0;MotState=0;}else if(State3==1&&LSpeed<4&&RSpeed<4){//TurnState=1;LSpeed++;RSpeed=2;}}}//显示预处理void DisBuf(void){if(RTime_cnt==100){Sec++;RTime_cnt=0;}if(Sec==60){Min++;Sec=0;}if(State4==1){dispbuf[0]=Sec%10;dispbuf[1]=Sec/10;dispbuf[2]=Min;if(!DirState) //正转dispbuf[3]=LSpeed;if(DirState) //反转dispbuf[3]=LSpeed+4;}if(State4==0){if(State3==0){dispbuf[0]=Sec%10;dispbuf[1]=Sec/10;dispbuf[2]=Min;dispbuf[3]=0;}if(State3==1){dispbuf[0]=RSpeed;dispbuf[1]=LSpeed;dispbuf[2]=Min;dispbuf[3]=9;}}}//LED驱动void disp( uchar H, uchar n ){P1=n;P1|=LedState ;P1|=LED_code_d[H];}//T0中断**显示/方波输出void Time_0() interrupt 1{TH0=0xFC;TL0=0x66;Widcnt++;Dispcnt++;//电机驱动/方波输出if(Widcnt>CIRCLE){Widcnt=1;}if(Widcnt<=LWidth)LMot_P=!DirState&&MotState;elseLMot_P=DirState&&MotState;LMot_M=DirState&&MotState;if(Widcnt<=RWidth)RMot_P=!DirState&&MotState;elseRMot_P=DirState&&MotState;RMot_M=DirState&&MotState;//显示if(Dispcnt==5){disp(dispbitcnt,dispbuf[dispbitcnt]);dispbitcnt++;if(dispbitcnt==4){dispbitcnt=0;}Dispcnt=0;}}//T1中断**运行时间void Time_1() interrupt 3{TH1=0xDB;TL1=0xFF;RTime_cnt++;}/******配置文件Afx.h******/#ifndef _AFX_#define _AFX_typedef unsigned char uchar;typedef unsigned int uint;typedef unsigned long ulong;#endif/******IO配置文件Config.c******/#ifndef _Config_#define _Config_#include "Afx.h"#include <reg52.h>//显示定义sbit led=P3^2;//电机引脚定义sbit LMot_P=P2^2; sbit LMot_M=P2^3; sbit RMot_P=P2^0; sbit RMot_M=P2^1;#endif。
51单片机PWM电机调速程序
51单片机PWM电机调速程序#include#define TH0_TL0 (65536-1000)//设定中断的间隔时长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_delay;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 = x;while(Time_delay != 0);//等待中断,可减少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);//等待键松开}}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 = ~Flag;}while(!Key_turn);}}void Timer0_init(void) {TMOD=0x01; //定时器0工作于方式1 TH0=TH0_TL0/256;TL0=TH0_TL0%6;TR0=1;ET0=1;EA=1;}void main(void){Timer0_init();while(1){Motor_turn();Motor_speed_high();Motor_speed_low();}}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;}elsePWM2 = 0;if(count1 >= 100) {count1=0;}}else //电机反转{PWM2 = 0;if(++count1 < count0) {PWM1 = 1;}elsePWM1 = 0;if(count1 >= 100){count1=0;}}}这个程序是我转来的下载在硬件上是能通过的。
c51单片机C语言编写的PWM程序
89c51单片机C语言编写的P W M程序(共3页)-本页仅作为预览文档封面,使用时请删除本页-89c51单片机C语言编写的PWM程序PWM, 单片机, C语言, 程序, 编写分享到:新浪微博 QQ空间开心网人人网说明:本程序使用STC89C52RC单片机,晶振,要使用本程序需要自己修改,我是用来控制直流电机的,外接了L298驱动电路,有问题或意见请回复,谢谢^_^#include ""#include ""转;speed<0.反转(-100~100)调用:extern int abs(int val); 取绝对值返回:/******************************************************************/ void motor(char speed1,char speed2){ //==============左边电机============= if (speed1>0) { IN1 =0;IN2 =1;//正转} else if (speed1<0) { IN1 =1;IN2 =0;//反转}//==============右边电机============= if (speed2>0) { IN3 =1;IN4 =0;//正转} else if (speed2<0) { IN3 =0;IN4 =1;//反转}}/******************************************************************名称:motor_PWM();功能:PWM占空比输出参数:无调用:无返回:无/******************************************************************/void motor_PWM (){ uchar PWM_abs1; uchar PWM_abs2;PWM_abs1=MOTO_speed1; PWM_abs2=MOTO_speed2;if (PWM_abs1>PWMAnd) ENA=1; //左边电机占空比输出else ENA=0; if (PWM_abs2>PWMAnd) ENB=1; //右边电机占空比输出else ENB=0; if (PWMAnd>=PWM_COUST) PWMAnd=0; //PWM计数清零else PWMAnd+=1;}/******************************************************************名称:void TIME_Init ();功能:定时器初始化指令:调用:无返回:无/******************************************************************/void TIME_Init (){//=========定时器T2初始化 PWM==================T2CON = 0x00;T2MOD = 0x00;RCAP2H = 0xff; //定时RCAP2L = 0x47; TH2 = 0xff; TL2 = 0x47; ET2 = 1; //定时器2中断开TR2 = 1; //PWM定时器关,PWM周期为10ms }/******************************************************************名称:void PWM_Time2 () interrupt 5功能:T2中断,PWM控制参数:调用:motor_PWM();//PWM占空比输出返回:/******************************************************************/ void PWM_Time2 () interrupt 5{ TR2 = 0; TF2 = 0; ET2 = 0; //定时器0中断禁止motor_PWM();//PWM占空比输出ET2 = 1; //定时中断0开启TR2 = 1;}main(){TIME_Init () ;motor(50,50);//左右电机的转速都是50}。
PWM调速的C语言程序编写(非常简单)
PWM调速的C语言程序编写关于PWM的原理在上一篇文章中已经说的很详细了,现在就细说一下pwm C语言程序的编写。
C语言中PWM的编写有这么几种方法;一、用普通的I/O 口输出的PWM ,二、使用定时计数器编写,三、就是使用片内PWM了。
1 先说使用普通的I\O口编写PWM程序了。
使用I/O口输出PWM波形你必须首先明白PWM他的实质是:调制占空比,占空比就是波形中高电平的长度与整个波长的比值。
我们写C语言的目的是写PWM波形的一个周期。
在这个周期内高低电平的比值是可以改变的。
这也就符合了PWM的原意脉宽调制。
即高电平的宽度的调制。
当然了PWM他也可用于改变频率,我们这里只先说他改变脉宽。
一旦我们的C语言程序写完那么他产生的PWM波形的频率就一定了。
(也可写频率变化的PWM,难度有点大)一般我们控制使用1K 到10K的PWM波进行控制。
当然了你也可在要求不是很高的地方使用频率更低的PWM波。
比如在飞思卡尔智能车比赛中我们学校使用的PWM波频率只有600HZ.我们要改变一个PWM波周期内的高电平的宽度显然需要将一个PWM波的周期分成单片机可以控制的N个小的周期,N的取值越大你的调速等级越高,但产生的PWM频率就越低。
我们下面以实现100级调速为例编写PWM程序。
先写出程序再慢慢给大家分析void pwm (uchar x,uint y) //X 为占空比 Y为函数使用时间{ uint i,j,a,b;for(i=y;i>0;i--) //定时外函数{for(j=7;j>0;j--) //定时内函数{for(a=y;a>0;a--) //PWM波高电平宽度{PORTA=0X01;}for(b=100-y;b>0;b--) //PWM低电平宽度{PORTA=0X00;}}}}这个程序够简单吧轻松的实现AVR单片机的PA.0口输出7KHZ左右的PWM脉冲你可以将PORTA=0X01;改为P1.0=0X01;就可以移植到51单片机上了为什么使用参数Y定时是因为用普通I/O口控制它的开关没有使用定时器编写的灵活。
51单片机控制直流电机调速电路(含C语言源程序)
51单片机控制直流电机调速电路(含C语言源程序)在自动化控制中,许多场合需要单片机控制直流电机进行变速,这里我们介绍一种低成本的简单实现方法。
经实践证明,运行稳定可靠。
直流电机变速原理通过电机学知识,我们可知,直流电机的转速为:直流电机的变速主要有3种方式:1.控制电枢电压改变电机的转速。
2.控制电机的励磁电流改变电机的转速。
3.在电枢回路中,串联电阻改变电机的转速。
使用单片机控制直流电机的变速。
一般采用调节电枢电压的方式,如图1所示,单片机P36输出的为宽度可变的负脉冲,这样电机电枢上的电压也为宽度可变的脉冲电压,根据公式:U=aVCC其中:U-电机电枢电压。
a-脉冲的占空比,范围在0~1之间。
Vcc-直流电源电压,这里为12V。
电机的电枢电压即受单片机输出脉宽控制,实现了利用脉冲宽度调制技术(PWM)进行直流电机的变速。
直流电机变速的实例及编程图2为笔者设计的“电喷汽车喷油嘴清洗机”(一种保养汽车的设备)电路原理,根据需要,作业时可随时按下“压力+”、“压力-”键,控制直流电机M的转速,即改变了洗涤液输出的压力大小。
图3为PWM波的输出示意,为了叙述简单,我们把PWM波的周期定为1mS,占空比分10级可调(即每级级差为10%),这样定时器TO每01mS(即100μS)产生一次定时中断,每10次中断后进入下一个PWM波的周期。
图3中的脉冲占空比为60%,即输出脉冲的时间为600 μS,断开脉冲的时间为400 μS,这样电机的电枢电压为12*60%=72V。
该变速程序配合A189S51单片机,产生的PWM波载频为1KHz,电机运行时有一些声响,适用于一些对噪音不十分讲究的场合。
如将载频提升到10~15KHz以上时,则基本听不到噪音,由于A T89S51的运算速度有限,不可能实现这一目标。
这时我们可考虑使用高速8位单片机,如:C8051F020、A VR单片机等,它们不仅运行速度快,而且在片内集成了控制电机专用的PWM部件,用来对直流电机进行变速控制将会得心应手。
8051单片机控制步进电机的C51语言编写的PWM控制程序
8051单片机控制步进电机的C51语言编写的PWM控制程序#include <intrins.h>#include <stdio.h>#include <math.h>#include "UPSD3200.H"#include "upsd_pwm.h"#define uint unsigned int#define uchar unsigned charPSD_REGS PSD8xx_reg _at_ csiop;#define KEYIO (~(PSD8xx_reg.DATAIN_A)) & 0x07sbit CP=P4^7;sbit U_D=P1^1;void init_system(); // 系统初始化uchar keyboard();void uPSD_PWM4_Variable(unsigned char PWM_Period, unsigned char PWM_PulseWidth); uchar Adjust_station=NO;unsigned char data x,flag;unsigned char keyboard() //键盘输入{unsigned char a=0xff,b=0x01,c=0xf8,d;//有按键的位置uint i;do{a=KEYIO|c;}while(a==0xff);if (a == 0xfe){d = '1';}else if (a == 0xfd){d = '2';}else if (a == 0xfb){d = '3';}else {d = '0';}return(d);}void uPSD_PWM4_Init(void)unsigned int PWM_prescaler;P4SFS |= 0x80;PWM_prescaler = (unsigned int)((FREQ_OSC/2)/PWM4_INPUT_freq);//PWM4输入脉冲频率K PSCL1L = PWM_prescaler & 0x00ff;PSCL1H = (PWM_prescaler >> 8);}void StepMotor_GO(bit direction,uint speed) {unsigned char PWM_Period, PWM_PulseWidth;uint temp_uint;U_D = direction;//方向temp_uint = (PWM4_INPUT_freq*1000)/speed;PWM_Period = (unsigned char)temp_uint;PWM_PulseWidth = PWM_Period/2;uPSD_PWM4_Variable(PWM_Period,PWM_PulseWidth);}void StepMotor_STOP(void){P4SFS &= 0x7f;}void uPSD_PWM4_Variable(unsigned char PWM_Period, unsigned char PWM_PulseWidth) {P4SFS |= 0x80;PWMVP = PWM_Period;PWMVPW = PWM_PulseWidth;PWMCON |= 0x20;}void initkey(void){PSD8xx_reg.DATAOUT_A=0xFF;PSD8xx_reg.CONTROL_A=0x00;PSD8xx_reg.DIRECTION_A=0x00;}void init_system() // 系统初始化{WDKEY=0x55;P4SFS = (unsigned char) (0x08 << 3);uPSD_PWM_Channel_8bit(3,243);问题补充:(接着上面的序)void uPSD_PWM_Init_8bit(unsigned char PWM_channel_no, unsigned int PWM_freq8, unsigned char PWMCON_value){unsigned int PWM_prescaler;unsigned char output_polarity_mode;output_polarity_mode = PWMCON_value & 0x8F;PWMCON = (PWMCON & 0x70) | output_polarity_mode;P4SFS = (unsigned char) (0x08 << PWM_channel_no);PWM_prescaler = (unsigned int) ( (((unsigned int) FREQ_OSC) / 2) / PWM_freq8);PSCL0L = PWM_prescaler & 0x00ff;PSCL0H = (PWM_prescaler >> 8);PSCL1L = PWM_prescaler & 0x00ff;PSCL1H = (PWM_prescaler >> 8);}void uPSD_PWM_Disable(void){PWMCON &= 0xDF;}void main(void){x=0;init_system();flag=1;while(flag==1){x=keyboard();if(x=='1') {StepMotor_GO(0,100);}else if(x=='2') {StepMotor_GO(1,500);}else if(x=='3') { StepMotor_STOP();uPSD_PWM_Disable();} else if(x=='0') {uPSD_PWM_Disable();}}}。
基于MC51单片机的直流电机PWM调速系统
基于MC51单片机的直流电机PWM调速系统一、概述随着现代工业技术的不断发展,直流电机因其良好的调速性能和控制精度,在工业自动化、机器人、航空航天等领域得到了广泛的应用。
PWM(脉宽调制)技术作为一种高效的电机调速方法,能够有效地控制直流电机的速度和方向。
本文旨在介绍一种基于MC51单片机的直流电机PWM调速系统,通过单片机实现对直流电机的精确控制。
该系统以MC51单片机为核心控制器,利用其强大的运算能力和丰富的外设接口,实现对直流电机的PWM调速控制。
系统通过采集电机的实时转速信息,结合用户设定的目标转速,利用PWM信号调整电机的输入电压,从而实现对电机转速的精确控制。
系统还具备过流、过压等保护功能,确保电机在安全可靠的环境下运行。
基于MC51单片机的直流电机PWM调速系统具有结构简单、控制精度高、响应速度快等优点,适用于各种需要精确控制直流电机转速的场合。
通过本系统的研究与应用,可以进一步提高工业自动化水平,推动相关产业的发展。
1. 直流电机PWM调速系统的研究背景与意义直流电动机作为最早出现的电动机类型,长期以来在调速控制领域占据着统治地位。
其良好的线性调速特性、简单的控制性能、高效的能量转换效率以及优异的动态特性,使得直流电动机在各种应用场景中得到了广泛的应用。
特别是在对调速性能要求较高的场合,如电力牵引、轧钢机、起重设备等,直流电动机更是发挥了不可替代的作用。
随着科学技术的不断进步和工业应用需求的日益复杂,传统的直流电机调速方式已经难以满足现代工业生产的需求。
传统的调速方法往往存在调速精度不高、调速范围有限、能耗较大等问题,严重制约了直流电动机在更多领域的应用。
为了解决这些问题,PWM(脉冲宽度调制)调速技术应运而生。
PWM技术利用微处理器的数字输出来对模拟电路进行控制,具有控制简单、灵活和动态响应好的优点。
通过将PWM技术应用于直流电机调速系统,可以实现对电机转速的精确控制,提高调速精度和调速范围,同时降低能耗,提高系统的稳定性和可靠性。
基于51单片机的PWM直流电机调速系统
基于51单片机的PWM直流电机调速系统一、本文概述随着现代工业技术的飞速发展,直流电机调速系统在众多领域如工业自动化、智能家居、航空航天等得到了广泛应用。
在众多调速方案中,基于脉冲宽度调制(PWM)的调速方式以其高效、稳定、易于实现等优点脱颖而出。
本文旨在探讨基于51单片机的PWM直流电机调速系统的设计与实现,以期为相关领域的技术人员提供一种可靠且实用的电机调速方案。
本文将简要介绍PWM调速的基本原理及其在直流电机控制中的应用。
随后,将详细介绍基于51单片机的PWM直流电机调速系统的硬件设计,包括电机选型、驱动电路设计、单片机选型及外围电路设计等。
在软件设计部分,本文将阐述PWM信号的生成方法、电机转速的检测与控制算法的实现。
还将对系统的性能进行测试与分析,以验证其调速效果及稳定性。
本文将总结基于51单片机的PWM直流电机调速系统的优点与不足,并提出改进建议。
希望通过本文的阐述,能为相关领域的研究与应用提供有益参考。
二、51单片机基础知识51单片机,也被称为8051微控制器,是Intel公司在1980年代初推出的一种8位CISC(复杂指令集计算机)单片机。
尽管Intel公司已经停止生产这种芯片,但由于其架构的通用性和广泛的应用,许多其他公司如Atmel、STC等仍然在生产与8051兼容的单片机。
51单片机的核心部分包括一个8位的CPU,以及4KB的ROM、低128B 的RAM和高位的SFR(特殊功能寄存器)等。
它还包括两个16位的定时/计数器,四个8位的I/O端口,一个全双工的串行通信口,以及一个中断系统。
这些功能使得51单片机在多种嵌入式系统中得到了广泛的应用。
在PWM(脉冲宽度调制)直流电机调速系统中,51单片机的主要作用是生成PWM信号以控制电机的速度。
这通常是通过定时/计数器来实现的。
定时/计数器可以设置一定的时间间隔,然后在这个时间间隔内,CPU可以控制I/O端口产生高电平或低电平,从而形成PWM信号。
直流电机PWM调速程序(C语言)
直流电机PWM调速程序(C语言)#include<reg52.h>//头文件#define ulong unsigned long//关键字宏定义 #define uchar unsigned charsbit motor_l_a=P0^2;//直流电机控制线接口定义 sbit motor_l_b=P0^3;// sbit motor_r_a=P0^0;// sbit motor_r_b=P0^1;// sbit motor_l_en=P0^4;// sbit motor_r_en=P0^5;////*****************变量定义***************************//ulong delay_flag=0;//用于较精确延时的变量 uchar pwm=0;//定时器0中断服务程序中的计数变量 uchar PWM_L=0,PWM_R=0;//***************函数声明******************************//void init_time0();//定时器0初始化函数 void motor_run(uchardirect,uchar speed_l,uchar speed_r);//直流电机控制函数.direct 控制方向,speed分别控制两个电机转速//***************主函数********************************//void main(){uchar i;//用于直流电机循环工作中的变量init_time0();//调用初始化函数while(1){for(i=0;i<11;i++)//直流电机正向加速{motor_run(1,i,i);delay_flag=20000;while(delay_flag);}for(i=10;i>0;i--)//直流电机反向减速{motor_run(0,i,i);delay_flag=20000;while(delay_flag);}}}void time0_pwm() interrupt 1//定时器0中断服务程序 { //**********************直流电机PWM调速部分***************************//pwm++;if(pwm==10)//设置PWM调速周期为1ms。
【C语言学习】51单片机L298N驱动电机调速
【C语言学习】51单片机L298N驱动电机调速51单片机L298N驱动电机调速//=============L298N端口定义===============sbit ENA = P3^6; //左轮驱动使能sbit IN1 = P0^3; //左轮黑线(-)sbit IN2 = P0^4; //左轮红线(+)sbit IN3 = P0^5; //右轮红线(-)sbit IN4 = P0^6; //右轮黑线(+)sbit ENB = P3^7; //右轮驱动使能//=============PWM================#define PWM_COUST 100 //PWM细分等份uchar MOTO_speed1; //左边电机转速uchar MOTO_speed2; //右边电机转速uchar PWM_abs1; //左边电机取绝对值后占空比uchar PWM_abs2; //左边电机取绝对值后占空比uchar PWM_var1=20; //左边电机直走速度(不同的电机,此参数不同)uchar PWM_var2=20; //右边电机直走速度uchar PWMAnd = 0; //PWM自增变量void motor(char speed1,char speed2){//==============左边电机=============if (speed1>0){IN1 =0;IN2 =1;//正转}else if (speed1<0){IN1 =1;IN2 =0;//反转}//==============右边电机=============if (speed2>0){IN3 =1;IN4 =0;//正转}else if (speed2<0){IN3 =0;IN4 =1;//反转}}void motor_PWM (){uchar PWM_abs1;uchar PWM_abs2;PWM_abs1=MOTO_speed1;PWM_abs2=MOTO_speed2;if (PWM_abs1>PWMAnd) ENA=1; //左边电机占空比输出else ENA=0;if (PWM_abs2>PWMAnd) ENB=1; //右边电机占空比输出else ENB=0;if (PWMAnd>=PWM_COUST) PWMAnd=0; //PWM计数清零else PWMAnd+=1;}void TIME_Init (){//=========定时器T2初始化PWM==================T2CON = 0x00;T2MOD = 0x00;RCAP2H = 0xff; //定时0.1msRCAP2L = 0x47;TH2 = 0xff;TL2 = 0x47;ET2 = 1; //定时器2中断开TR2 = 1; //PWM定时器关,PWM周期为10ms}void PWM_Time2 () interrupt 5{TR2 = 0;TF2 = 0;ET2 = 0; //定时器0中断禁止motor_PWM();//PWM占空比输出ET2 = 1; //定时中断0开启TR2 = 1;}main(){TIME_Init () ;motor(50,50);//左右电机的转速都是50 }。