单片机PWM电机调速程序

合集下载

PWM调速的C语言程序编写(非常简单)

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单片机pwm调速程序

51单片机pwm调速程序

51单片机pwm调速程序此程序是一个用51单片机来调直流电机转速的程序。

当然也可以用来调整led灯的亮度,用定时器2来实现. #include //包括一个52标准内核的头文件#define uchar unsigned char#define uint unsigned int#define ulong unsigned longsbit PWM = P3^3; //要控制的风扇sbit K= P3^7; //按键控制转速uchar scale;//用于保存占空比的输出0的时间份额,总共10份//延时程序void delay10ms(void){unsigned char i,j;for(i=20;i>0;i--)for(j=248;j>0;j--);}// 主程序void main(void){RCAP2H =0xF3; //赋T2的预置值,溢出1次是1/1200秒钟RCAP2L =0x98;scale=10;TR2=1; //启动定时器ET2=1; //打开定时器2中断EA=1; //打开总中断while(1) //程序循环{while(K==0){scale++;while(K==0);if(scale==11)scale=0;}}}//1/1200秒定时器2中断timer2() interrupt 5{static uchar tt=0; //tt用来保存当前时间在一秒中的比例位置TF2=0;tt++;if(tt==10) //每1/120秒整开始输出低电平{tt=0;if(scale!=0) //这里加这一句是为了消除灭灯状态产生的鬼影PWM=0;}if(scale==tt) //按照当前占空比切换输出高电平PWM=1;}。

PWM调速的C语言程序编写(非常简单)

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口控制它的开关没有使用定时器编写的灵活。

单片机实现直流电机PWM调速系统毕业设计

单片机实现直流电机PWM调速系统毕业设计

畢業設計(論文)題目:利用單片機控制的直流電機轉速系統的設計班級:XX姓名:XZ指導教師:XX說明:8051畢業設計任務書7 (3)一、設計題目 (3)第1章緒論 (5)1.1利用單片機控制的直流電機轉速系統設計目的和意義 (5)1.1.1選題的目的和意義 (5)1.1.2國內外研究現狀簡述: (5)1.1.3畢業設計(論文)所採用的研究方法和手段: (5)1.2利用單片機控制的直流電機轉速系統的設計設計專案發展 (6)1.3利用單片機控制的直流電機轉速系統的設計原理 (6)第2章系統硬體電路的設計 (8)2.1 系統總體設計框圖及單片機系統的設計 (9)2.1.1 系統總體設計框圖 (9)2.1.2 8051單片機簡介 (9)2.1.3 單片機系統中所用其他晶片簡介 (11)2.1.4 8051單片機擴展電路及分析 (15)2.2 PWM信號發生電路設計 (17)2.2.1 PWM的基本原理 (17)2.2.2 PWM信號發生電路設計 (18)2.2.3 PWM發生電路主要晶片的工作原理 (19)2.3 功率放大驅動電路設計 (22)2.3.1 晶片IR2110性能及特點 (22)2.3.2 IR2110的引腳圖以及功能 (23)2.4 主電路設計 (25)2.4.1 延時保護電路 (25)2.4.2 主電路 (25)2.4.3 輸出電壓波形 (28)2.5 測速發電機 (28)2.6 濾波電路 (29)2.7 A/D轉換 (29)1.7.1 晶片ADC0809介紹 (29)2.7.2 ADC0809的引腳及其功能 (29)第3章.直流調速系統 (30)3.1 直流調速系統概述 (31)3.2單閉環直流調速系統 (31)3.3開環系統機械特性和閉環系統靜特性的比較 (33)第4章利用單片機控制的直流電機轉速系統的設計 (35)4.1系統軟體部分的設計 (35)4.1.1 PI 轉速調節器原理圖及參數計算 (35)4.2 控制電路設計 (36)4.2.1 單片機資源分配 (36)4.2.2 程式流程圖 (40)第5章結論 (41)致謝 (42)參考文獻 (43)畢業設計任務書7一、設計題目利用單片機控制的直流電機轉速系統的設計二、設計要求設計一個用單片機實現對直流電機轉速控制系統。

基于单片机STC89C52的直流电机PWM调速控制系统

基于单片机STC89C52的直流电机PWM调速控制系统

第一章:前言Pwm 电机调速原理对于电机的转速调整,我们是采用脉宽调制(PWM)办法,控制电机的时候,电源并非连续地向电机供电,而是在一个特定的频率下以方波脉冲的形式提供电能。

不同占空比的方波信号能对电机起到调速作用,这是因为电机实际上是一个大电感,它有阻碍输入电流和电压突变的能力,因此脉冲输入信号被平均分配到作用时间上,这样,改变在始能端EN1 和EN2 上输入方波的占空比就能改变加在电机两端的电压大小,从而改变了转速。

此电路中用微处理机来实现脉宽调制,通常的方法有两种:(1)用软件方式来实现,即通过执行软件延时循环程序交替改变端口某个二进制位输出逻辑状态来产生脉宽调制信号,设置不同的延时时间得到不同的占空比。

(2)硬件实验自动产生PWM 信号,不占用CPU 处理的时间。

这就要用到STC89C52的在PWM模式下的计数器1,具体内容可参考相关书籍。

51 单片机PWM 程序产生两个PWM,要求两个PWM 波形占空都为80/256,两个波形之间要错开,不能同时为高电平!高电平之间相差48/256,PWM 这个功能在PIC 单片机上就有,但是如果你就要用51 单片机的话,也是可以的,但是比较的麻烦.可以用定时器T0来控制频率,定时器T1 来控制占空比:大致的的编程思路是这样的:T0 定时器中断是让一个I0口输出高电平,在这个定时器T0的中断当中起动定时器T1,而这个T1 是让IO 口输出低电平,这样改变定时器T0 的初值就可以改变频率,改变定时器T1 的初值就可以改变占空比。

前言:直流电机的定义:将直流电能转换成机械能(直流电动机)或将机械能转换成直流电能(直流发电机)的旋转电机。

近年来,随着科技的进步,直流电机得到了越来越广泛的应用,直流具有优良的调速特性,调速平滑,方便,调速范围广,过载能力强,能承受频繁的冲击负载,可实现频繁的无极快速起动、制动和反转,需要满足生产过程自动化系统各种不同的特殊要求,从而对直流电机提出了较高的要求,改变电枢回路电阻调速、改变电压调速等技术已远远不能满足现代科技的要求,这是通过 PWM 方式控制直流电机调速的方法就应运而生。

51单片机控制直流电机PWM调速

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端口来提供模拟时序信号。

PWM电机调速原理及51单片机PWM程序经典

PWM电机调速原理及51单片机PWM程序经典

PWM电机调速原理及51单片机PWM程序经典pwm电机调速原理对于电机的转速调整,我们是采用脉宽调制(pwm)办法,控制电机的时候,电源并非连续地向电机供电,而是在一个特定的频率下以方波脉冲的形式提供电能。

不同占空比的方波信号能对电机起到调速作用,这是因为电机实际上是一个大电感,它有阻碍输入电流和电压突变的能力,因此脉冲输入信号被平均分配到作用时间上,这样,改变在始能端pe2和pd5上输入方波的占空比就能改变加在电机两端的电压大小,从而改变了转速。

此电路中用微处理机去同时实现脉宽调制,通常的方法存有两种:(1)用软件方式来实现,即通过执行软件延时循环程序交替改变端口某个二进制位输出逻辑状态去产生脉宽调制信号,设置相同的延时时间获得相同的充电电流。

(2)硬件实验自动产生pwm信号,不挤占cpu处置的时间。

这就要用到atmega8515l的在pwm模式下的计数器1,具体内容可参考相关书籍。

51单片机pwm程序产生两个pwm,要求两个pwm波形占空都为80/256,两个波形之间要错开,不能同时为高电平!高电平之间相差48/256,pwm这个功能在pic单片机上就存有,但是如果你就要用51单片机的话,也就是可以的,但是比较的麻烦.可以用定时器t0去掌控频率,定时器t1去掌控充电电流:大致的的编程思路就是这样的:t0定时器中断就是使一个i0口输入高电平,在这个定时器t0的中断当中再生制动定时器t1,而这个t1就是使io口输入低电平,这样发生改变定时器t0的初值就可以发生改变频率,发生改变定时器t1的初值就可以发生改变充电电流。

*程序思路说明:****关于频率和占空比的确定,对于12m晶振,假定pwm输出频率为1khz,这样定时中断次数**预设为c=10,即0.01ms中断一次,则th0=ff,tl0=f6;由于预设中断时间为0.01ms,这样**可以设定占空比可从1-100变化。

即0.01ms*100=1ms******************************************************************************* /#include#defineucharunsignedchar/******************************************************************************th0和tl0是计数器0的高8位和低8位计数器,计算办法:tl0=(65536-c)%6;**th0=(65536-c)/256,其中c为所要计数的次数即为多长时间产生一次中断;tmod就是计数器**工作模式挑选,0x01则表示采用模式1,它存有16十一位计数器,最小计数脉冲为65536,最久时**间为1ms*65536=65.536ms******************************************************************************* /#definev_th00xff#definev_tl00xf6#definev_tmod0x01voidinit_sys(void);/*系统初始化函数*/voiddelay5ms(void);unsignedcharzkb1,zkb2;voidmain(void){init_sys();zkb1=40;/*占空比初始值设定*/zkb2=70;/*占空比初始值设定*/while(1){if(!p1_1)//如果按了+键,减少充电电流{delay5ms();if(!p1_1){zkb1++;zkb2=100-zkb1;}}if(!p1_2)//如果按了-键,增加充电电流{delay5ms();if(!p1_2){zkb1--;zkb2=100-zkb1;/*对占空比值限定范围*/if(zkb1>99)zkb1=1;if(zkb1<1)zkb1=99;}}/*******************************************************函数功能:对系统进行初始化,包括定时器初始化和变量初始化*/voidinit_sys(void)/*系统初始化函数*/{/*定时器初始化*/tmod=\th0=v_th0;tl0=v_tl0;tr0=1;et0=1;ea=\}//延时voiddelay5ms(void){unsignedinttempcyc=1000;while(tempcyc--);}/*中断函数*/voidtimer0(void)interrupt1using2{staticucharclick=\/*中断次数计数器变量*/th0=v_th0;/*恢复定时器初始值*/tl0=v_tl0;++click;if(click>=100)click=\if(click<=zkb1)/*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/p1_3=0;elsep1_3=1;if(click<=zkb2)p1_4=0;elsep1_4=1;}<1.下面就是avr的程序,51产生pwm波麻烦,可以用avr。

单片机产生PWM信号控制直流电机调速的源代码

单片机产生PWM信号控制直流电机调速的源代码

单片机产生PWM信号控制直流电机调速的源代码本例程利用2051的T0产生双路PWM信号,推动L293D或L298N为直流电机调速,程序已通过调试。

接L298N时相应的管脚上最好接上10K的上拉电阻。

有什么不对的地方欢迎大家批评指正!/* =======直流电机的PWM速度控制程序======== *//* 晶振采用11.0592M,产生的PWM的频率约为91Hz */#include<reg51.h>#include<math.h>#define uchar unsigned char#define uint unsigned intsbit en1=P1^0; /* L298的Enable A */sbit en2=P1^1; /* L298的Enable B */sbit s1=P1^2; /* L298的Input 1 */sbit s2=P1^3; /* L298的Input 2 */sbit s3=P1^4; /* L298的Input 3 */sbit s4=P1^5; /* L298的Input 4 */uchar t=0; /* 中断计数器*/uchar m1=0; /* 电机1速度值*/uchar m2=0; /* 电机2速度值*/uchar tmp1,tmp2; /* 电机当前速度值*//* 电机控制函数index-电机号(1,2); speed-电机速度(-100—100) */void motor(uchar index, char speed){if(speed>=-100 && speed<=100){if(index==1) /* 电机1的处理*/{m1=abs(speed); /* 取速度的绝对值*/if(speed<0) /* 速度值为负则反转*/{s1=0;s2=1;}else /* 不为负数则正转*/{s1=1;s2=0;}}if(index==2) /* 电机2的处理*/{m2=abs(speed); /* 电机2的速度控制*/if(speed<0) /* 电机2的方向控制*/{s3=0;s4=1;}else{s3=1;s4=0;}}}}void delay(uint j) /* 简易延时函数*/{for(j;j>0;j--);}void main(){uchar i;TMOD=0x02; /* 设定T0的工作模式为2 */ TH0=0x9B; /* 装入定时器的初值*/TL0=0x9B;EA=1; /* 开中断*/ET0=1; /* 定时器0允许中断*/TR0=1; /* 启动定时器0 */while(1) /* 电机实际控制演示*/{for(i=0;i<=100;i++) /* 正转加速*/{motor(1,i);motor(2,i);delay(5000);}for(i=100;i>0;i--) /* 正转减速*/{motor(1,i);motor(2,i);delay(5000);}for(i=0;i<=100;i++) /* 反转加速*/{motor(1,-i);motor(2,-i);delay(5000);}for(i=100;i>0;i--) /* 反转减速*/{motor(1,-i);motor(2,-i);delay(5000);}}}void timer0() interrupt 1 /* T0中断服务程序*/{if(t==0) /* 1个PWM周期完成后才会接受新数值*/{tmp1=m1;tmp2=m2;}if(t<tmp1) en1=1; else en1=0; /* 产生电机1的PWM信号*/ if(t<tmp2) en2=1; else en2=0; /* 产生电机2的PWM信号*/ t++;if(t>=100) t=0; /* 1个PWM信号由100次中断产生*///4级速度可调:0、1、2、3;对应占空比:0、1/4、2/4、3/4#include<reg52.h>sbit key=P3^6;sbit motor=P2^4;unsigned char key_scan(void);void motor_set(unsigned char v) ;void motor_init(void);unsigned char PWM_H=0,n=0,i=0;void main(){motor_init();while(1){if (key_scan() == 1){motor_set(i%4);}}}//电机转动void motor_run() interrupt 3{if(n<PWM_H) motor=1;else motor=0;n++;if(n>=4) n=0;}//速度控制,4级速度可调:0、1、2、3;对应占空比:0、1/4、2/4、3/4 void motor_set(unsigned char v){if (v>3) v=3;if (v == 0) TR1 = 0;else{TR1 = 1;PWM_H = v;}}//电机初始化void motor_init(void){EA=1;ET1=1;TMOD=TMOD & 0X0F | 0x20;}//扫描按键unsigned char key_scan(void){unsigned char on = 0,i;while(1){if(key==0) //判断是否按下{for(i=0;i<100;i++); //软件延时if(key==0) //再次判断是否按下{on = 1;break; //跳出循环}}}while(key==0);return 1;}}。

单片机课程设计PWM直流电动机调速控制系统方案

单片机课程设计PWM直流电动机调速控制系统方案

单片机原理及应用—— P W M直流电机调速控制系统概括直流电动机具有良好的启动性能和调速特性。

具有起动转矩大、调速平稳、经济大范围、调速容易、调速后效率高等特点。

本文设计的直流电机调速系统主要由51单片机、电源、H桥驱动电路、LED 液晶显示器、霍尔测速电路和独立按键组成的电子产品组成。

电源采用78系列芯片,采用PWM波方式实现电机+5V、+15V调速,PWM为脉宽调制,通过51单片机改变占空比实现。

通过独立的按键实现电机的启停、调速和转向的手动控制,LED实现测量数据(速度)的显示。

电机转速采用霍尔传感器检测输出方波,通过51单片机统计1秒内方波脉冲个数,计算电机转速,实现直流电机的反馈控制。

关键词:直流电机调速; H桥驱动电路; LED显示屏; 51单片机目录摘要2摘要错误!未定义书签。

目录3第 1 章引言41.1 概述41.2 国外发展现状41.3 要求51.4 设计目的及6第 2 章项目论证与选择72.1 电机调速模块72.2 PWM调速工作模式72.3 PWM脉宽调制方式错误!未定义书签。

2.4 PWM 软件实现错误!未定义书签。

第三章系统硬件电路设计83.1 信号输入电路83.2 电机PWM驱动模块电路9第 4 章系统的软件设计104.1 单片机选型104.2 系统软件设计分析10第 5 章 MCU 系统集成调试135.1 PROTEUS 设计与仿真平台错误!未定义书签。

18传统开发流程对比错误!未定义书签。

第一章简介1.1 概述现代工业的电驱动一般要求部分或全部自动化,因此必须与各种控制元件组成的自动控制系统相联动,而电驱动可视为自动电驱动系统的简称。

在这个系统中,生产机械可以自动控制。

随着现代电力电子技术和计算机技术的发展以及现代控制理论的应用,自动电驱动正朝着计算机控制的生产过程自动化方向发展。

以实现高速、高质量、高效率的生产。

在大多数集成自动化系统中,自动化电力牵引系统仍然是不可或缺的组成部分。

单片机课程设计完整版《PWM直流电动机调速控制系统》

单片机课程设计完整版《PWM直流电动机调速控制系统》

单片机原理及应用课程设计报告设计题目:学院:专业:班级:学号:学生姓名:指导教师:年月日目录设计题目 (3)1 设计要求及主要技术指标: (4)1.1 设计要求 (4)1.2 主要技术指标 (5)2 设计过程 (6)2.1 题目分析 (9)2.2 整体构思 (10)2.3 具体实现 (12)3 元件说明及相关计算 (14)3.1 元件说明 (14)3.2 相关计算 (15)4 调试过程 (16)4.1 调试过程 (16)4.2 遇到问题及解决措施 (20)5 心得体会 (21)参考文献 (22)附录一:电路原理图 (23)附录二:程序清单 (24)设计题目:PWM直流电机调速系统本文设计的PWM直流电机调速系统,主要由51单片机、电源、H桥驱动电路、LED液晶显示器、霍尔测速电路以及独立按键组成的电子产品。

电源采用78系列芯片实现+5V、+15V对电机的调速采用PWM波方式,PWM是脉冲宽度调制,通过51单片机改变占空比实现。

通过独立按键实现对电机的启停、调速、转向的人工控制,LED实现对测量数据(速度)的显示。

电机转速利用霍尔传感器检测输出方波,通过51单片机对1秒内的方波脉冲个数进行计数,计算出电机的速度,实现了直流电机的反馈控制。

关键词:直流电机调速;定时中断;电动机;PWM波形;LED显示器;51单片机1 设计要求及主要技术指标:基于MCS-51系列单片机AT89C52,设计一个单片机控制的直流电动机PWM 调速控制装置。

1.1 设计要求(1)在系统中扩展直流电动机控制驱动电路L298,驱动直流测速电动机。

(2)使用定时器产生可控的PWM波,通过按键改变PWM占空比,控制直流电动机的转速。

(3)设计一个4个按键的键盘。

K1:“启动/停止”。

K2:“正转/反转”。

K3:“加速”。

K4:“减速”。

(4)手动控制。

在键盘上设置两个按键----直流电动机加速和直流电动机减速键。

在手动状态下,每按一次键,电动机的转速按照约定的速率改变。

基于C51单片机的直流电机PWM调速控制(包含原理图及C源代码)

基于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调速前进程序源代码、电路原理图和器件表

51单片机智能小车PWM调速前进程序源代码、电路原理图、电路器件表从控制电路角度划分,智能小车电路板分为核心板和驱动板。

核心板上的处理器的芯片型号是:STC15W4K56S4,这是一款51单片机。

驱动板上有电源电路、电机驱动电路以及一些功能模块接口。

智能小车前进只要控制智能小车四个轮子向前转动就可以了。

智能小车四个轮子由四个直流减速电机驱动。

直流减速电机驱动芯片采用L293D,一片电机驱动芯片L293D可以驱动两个直流减速电机,智能小车用到4个直流减速电机,需要用到两片L293D电机驱动芯片。

但有时候我们需要控制智能小车的速度,不希望智能小车全速前进。

比如在“智能小车循迹实验”中,如果智能小车速度过快,来不及反应做出方向的调整,智能小车会很容易跑离轨迹,这样就需要调整控制智能小车的速度了。

那么怎么样实现智能小车前进速度的调节呢?调节智能小车的速度,实际上是调节电机的运转速度,PWM调速是目前电机的主流调速方式。

智能小车采用脉宽调制(PWM)的办法来控制电机的转速,从而控制智能小车的速度。

在此种情况下,电池电源并非连续地向直流电机供电,而是在一个特定的频率下为直流电机提供电能。

不同占空比的方波信号,调节对直流电机的通断电,能起到对直流电机调速作用。

这是因为电机实际上是一个大电感,它有阻碍输入电流和电压突变的能力,因此脉冲输入信号被平均分配到作用时间上。

这样,改变L293D使能端EN1和EN2上输入方波的占空比就能改变加在电机两端的电压大小,从而改变了直流电机转速。

智能小车PWM调速前进程序如下:首先,定义了2个变量,这2个变量用于设置智能小车的速度。

unsigned char pwmval_left_init=6; //调节此值可以调节小车的速度。

unsigned char pwmval_right_init=6; //调节此值可以调节小车的速度。

通过以下函数初始化定时器0,每1毫秒中断一次。

void Timer0_Init(void) //定时器0初始化{TMOD=0x01;TH0=0xf8;TL0=0xcd;TR0=1;ET0=1;EA=1;}下面我们看定时器0的中断处理函数。

单片机控制PWM的直流电机调速系统的设计

单片机控制PWM的直流电机调速系统的设计

单片机控制PWM的直流电机调速系统的设计PWM(脉宽调制)是一种常用的电压调节技术,可以用来控制直流电机的转速。

在单片机控制PWM的直流电机调速系统中,主要包括硬件设计和软件设计两个方面。

硬件设计方面,需要考虑的主要内容有:电机的选择与驱动、电源电压与电流的设计、速度反馈电路的设计。

首先,需要选择合适的直流电机和驱动器。

选择直流电机时需考虑其功率、转速、扭矩等参数,根据实际需求选择合适的电机。

驱动器可以选择采用集成驱动芯片或者离散元件进行设计,通过PWM信号控制电机的速度。

其次,需要设计合适的电源电压与电流供应。

直流电机通常需要较大的电流来实现工作,因此需要设计合适的电源电流,以及保护电路来防止电流过大烧坏电机和电路。

最后,需要设计速度反馈电路来实现闭环控制。

速度反馈电路可以选择采用编码器等传感器来获得转速信息,然后通过反馈控制实现精确的速度调节。

软件设计方面,需要考虑的主要内容有:PWM输出的控制、速度闭环控制算法的实现。

首先,需要编写代码实现PWM输出的控制。

根据具体的单片机型号和开发环境,使用相关的库函数或者寄存器级的编程来实现PWM信号的频率和占空比调节。

其次,需要实现速度闭环控制算法。

根据速度反馈电路获取的速度信息,通过比较目标速度与实际速度之间的差异,调整PWM信号的占空比来实现精确的速度调节。

常用的速度闭环控制算法有PID控制算法等。

最后,需要优化程序的鲁棒性和稳定性。

通过合理的调节PID参数以及增加滤波、抗干扰等功能,提升系统的性能和稳定性。

在实际的设计过程中,需要根据具体的应用需求和单片机性能等因素,进行合理的选择和调整。

同时,还需要通过实验和调试来验证系统的可靠性和稳定性,不断进行优化和改进,以获得较好的调速效果。

51单片机H桥电路控制电机正反转和PWM调速

51单片机H桥电路控制电机正反转和PWM调速

搭了个H桥电路,控制电机的正反转和PWM调速,程序是网上的,改改引脚就能用,电路和源程序如下:功能:P1.1按键停止,P1.2左转,P1.3右转,P1.0调速#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit PW1=P0^0 ;sbit PW2=P0^1 ; //控制电机的两个输入sbit accelerate=P1^0 ; //调速按键sbit stop=P1^1 ; //停止按键sbit left=P1^2 ; //左转按键sbit right=P1^3 ; //右转按键#define right_turn PW1=0;PW2=1 //顺时针转动#define left_turn PW1=1;PW2=0 //逆向转动#define end_turn PW1=1;PW2=1 //停转uint t0=25000,t1=25000; //初始时占空比为50%uint a=25000; // 设置定时器装载初值 25ms 设定频率为20Hzuchar flag=1; //此标志用于选择不同的装载初值uchar dflag; //左右转标志uchar count; //用来标志速度档位void keyscan(); //键盘扫描void delay(uchar z);void time_init(); //定时器的初始化void adjust_speed(); //通过调整占空比来调整速度//**********************************//void main(){time_init(); //定时器的初始化while(1){keyscan(); //不断扫描键盘程序,以便及时作出相应的响应}}//*************************************//void timer0() interrupt 1 using 0{if(flag){flag=0;end_turn;a=t0; //t0的大小决定着低电平延续时间TH0=(65536-a)/256;TL0=(65536-a)%256; //重装载初值}else{flag=1; //这个标志起到交替输出高低电平的作用if(dflag==0){right_turn; //右转}{left_turn; //左转}a=t1; //t1的大小决定着高电平延续时间TH0=(65536-a)/256;TL0=(65536-a)%256; //重装载初值}}void time_init(){TMOD=0x01; //工作方式寄存器软件起动定时器定时器功能方式1 定时器0 TH0=(65536-a)/256;TL0=(65536-a)%256; //装载初值ET0=1; //开启定时器中断使能EA=1; // 开启总中断TR0=0;}//****************************************//void delay(uchar z) //在12M下延时z毫秒{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}//******************************//void keyscan(){if(stop==0){TR0=0; //关闭定时器0 即可停止转动end_turn;}if(left==0){dflag=1; //转向标志置位则左转 }if(right==0){TR0=1;dflag=0; //转向标志复位则右转 }if(accelerate==0){delay(5) ; //延时消抖if(accelerate==0){while(accelerate==0) ; //等待松手count++;if(count==1){t0=20000;t1=30000; //占空比为百分之60 }if(count==2){t0=15000;t1=35000; //占空比为百分之70 }if(count==3){t0=10000;t1=40000; //占空比为百分之80 }if(count==4){t0=5000;t1=45000; //占空比为百分之90 }if(count==5){count=0;}}}}。

基于51单片机的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)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。

在所设计的这个电路中,用PWM对直流电机转速做精确控制。

电路中用到的电机驱动芯片L298N是SGS公司的产品,内部包含4通道逻辑驱动电路,是一种二相和四相电机的专用驱动器,即内含二个H桥的高电压大电流双全桥式驱动器,接收标准TTL逻辑电平信号,可驱动46V、2A以下的电机。

关键字:PWM 单片机L298 直流电机一、引言提到电机转速控制一般大家都会想到调节电机的供电电压,但调节电压会使电机的转矩发生很大的变化。

在实际生活中,很多时候我们希望能在电机转速得到控制的前提下保持电机的转矩,怎样克服这个问题呢,在查询了很多资料和进行了大量实验后我认为使用电机的PWM控制可以很好的解决这一问题。

二、设计原理在电机控制中我采用了脉宽调制PWM,脉宽宽度调制式(PWM)开关型稳压电路是在控制电路输出频率不变的情况下,通过电压反馈调整其占空比,从而达到稳定输出电压的目的。

模拟信号的值可以连续变化,其时间和幅度的分辨率都没有限制。

9V电池本身就是一种模拟器件,因为它的输出电压并不精确地等于9V,而是随时间发生变化,并可取任何实数值。

与此类似,从电池吸收的电流也不限定在一组可能的取值范围之内。

而模拟信号与数字信号的区别在于后者的取值通常只能属于预先确定的可能取值集合之内,例如在{0V, 5V}这一集合中取值。

尽管模拟控制看起来可能直观而简单,但它并不总是非常经济或可行的。

其中一点就是,模拟电路容易随时间漂移,因而难以调节。

能够解决这个问题的精密模拟电路可能非常庞大、笨重(如老式的家庭立体声设备)和昂贵。

模拟电路还有可能严重发热,其功耗相对于工作元件两端电压与电流的乘积成正比。

模拟电路还可能对噪声很敏感,任何扰动或噪声都肯定会改变电流值的大小。

单片机实现直流电机PWM调速系统毕业设计

单片机实现直流电机PWM调速系统毕业设计

毕业设计(论文)题目:利用单片机控制的直流电机转速系统的设计班级:XX姓名:XZ指导教师:XX说明:8051毕业设计任务书7 (3)一、设计题目 (3)第1章绪论 (5)1.1利用单片机控制的直流电机转速系统设计目的和意义 (5)1.1.1选题的目的和意义 (5)1.1.2国内外研究现状简述: (5)1.1.3毕业设计(论文)所采用的研究方法和手段: (5)1.2利用单片机控制的直流电机转速系统的设计设计项目发展 (6)1.3利用单片机控制的直流电机转速系统的设计原理 (6)第2章系统硬件电路的设计 (8)2.1 系统总体设计框图及单片机系统的设计 (9)2.1.1 系统总体设计框图 (9)2.1.2 8051单片机简介 (9)2.1.3 单片机系统中所用其它芯片简介 (11)2.1.4 8051单片机扩展电路及分析 (15)2.2 PWM信号发生电路设计 (17)2.2.1 PWM的基本原理 (17)2.2.2 PWM信号发生电路设计 (18)2.2.3 PWM发生电路主要芯片的工作原理 (19)2.3 功率放大驱动电路设计 (22)2.3.1 芯片IR2110性能及特点 (22)2.3.2 IR2110的引脚图以及功能 (23)2.4 主电路设计 (25)2.4.1 延时保护电路 (25)2.4.2 主电路 (25)2.4.3 输出电压波形 (28)2.5 测速发电机 (28)2.6 滤波电路 (29)2.7 A/D转换 (29)1.7.1 芯片ADC0809介绍 (29)2.7.2 ADC0809的引脚及其功能 (29)第3章.直流调速系统 (30)3.1 直流调速系统概述 (31)3.2单闭环直流调速系统 (31)3.3开环系统机械特性和闭环系统静特性的比较 (33)第4章利用单片机控制的直流电机转速系统的设计 (35)4.1系统软件部分的设计 (35)4.1.1 PI 转速调节器原理图及参数计算 (35)4.2 控制电路设计 (36)4.2.1 单片机资源分配 (36)4.2.2 程序流程图 (40)第5章结论 (41)致谢 (42)参考文献 (43)毕业设计任务书7一、设计题目利用单片机控制的直流电机转速系统的设计二、设计要求设计一个用单片机实现对直流电机转速控制系统。

PWM调速程序

PWM调速程序
//ICC-AVR application builder
// Target : M16
// Crystal: 8.0000Mhz
#include <iom16v.h>
#include <macros.h>
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x01;//set PA0 as PWM wave output port
}
#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
//TIMER1 has overflowed
TCNT1H = 0x00; //reload counter high value
TCNT1L = 0x00; //reload counter low value
TCCR1A = 0x01;
TCCR1B = 0x0C; //start Timer
}
#pragma interrupt_handler timer1_compa_isr:7
void timer1_compa_isr(void)
{
//compare occured TCNT1=OCR1A
PORTA&=~(1<<PA0); // clear PA0
void timer1_init(void)
{
TCCR1B = 0x00; //stop
//set initial value for counter
TCNT1H = 0x00; //setup
TCNT1L = 0x00;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档