C51 模仿PWM,可调
- 格式:docx
- 大小:9.14 KB
- 文档页数:1


基于51单片机的直流电机PWM调速系统作者:宫晓明来源:《科学家》2017年第16期摘要脉冲宽度调制(PWM)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。
本设计用单片机做微处理器来实现对直流电机的调速。
因此在设计中,对直流调速的原理、直流调速控制方式以及调速特性、PWM基本原理及实现方式进行了全面的阐述。
关键词单片机;PWM;直流电机中图分类号 TP3 文献标识码 A 文章编号 2095-6363(2017)16-0151-01随着电子技术、微电子技术的飞速发展,微型计算机发展很快,单片机技术成为自动控制技术的核心之一。
直流电机由于具有良好的启动,制动,调速性能也被广泛应用。
基于单片机的PWM调速系统对直流电机进行调速,通过以数字方式控制模拟电路,可以大幅度降低系统的成本和功耗,其控制简单,灵活。
1 硬件电路的设计1.1 控制电路的设计控制电路主要由STC89C51单片机来控制,编写一段程序使单片机发出的PWM脉冲来实现对驱动的控制。
1.2 霍尔元件测速部分电路的设计霍尔传感器是基于霍尔效应的一种磁敏式传感器。
由于霍尔元件产生的电势差很小,故通常将霍尔元件与放大器电路、温度补偿电路及稳压电源电路等集成在一个芯片上,称之为霍尔传感器。
1.3 电机控制正反转电路设计通过调节直流电机的电压可以改变电机的转速,本系统用脉宽调制(PWM)来实现调速。
方波的有效电压跟电压幅值和占空比有关,通过占空比实现改变有效电压。
用软件模拟PWM可以有延时和定时两种方法,延时方法占用大量的CPU,所以这里采用定时方法。
一个典型的直流电机控制电路,电路得名于“H桥驱动电路”。
4个三极管组成H的4条垂直腿,而电机就是H中的横杠。
H桥式电机驱动电路包括4个三极管和一个电机,要使电机运转,必须导通对角线上的一对三极管。
根据不同三极管对的导通情况,电流可能会从左至右或从右至左流过电机,从而控制电机的转向。
本系统直接用L293D芯片来实现。
用PWM控制渐变七彩灯C51程序
一、硬件介绍:
(采用5050LED 2W) RGB三色LED控制引脚分别为单片机P1.2、P1.1、P1.0。
LED正极接主电源(24V)正极,负极接驱动3颗三极管的集电极,单片机控制脚分别接3颗NPN三极管,三极管发射极接地,而单片机的供电是来自三端稳压器7805,祥细原理如下:
二、实物图片:
三、软件部分:
1、/*原理:先亮红灯(保持一会儿)----红绿过度(绿加1、红减1循环240次)------绿灯亮起(保持一会儿)----绿兰过度(兰加1、绿减1循环240次)-----兰灯亮起(保持)-----兰白过度(绿加1、红加1循环240次、兰不变)---白红过度,技术支持网站:51hei/全部程序源代码:点此下载*/tips:感谢大家的阅读,本文由我司收集整编。
仅供参阅!。
一、 基本原理介绍二、演示机构采用的是舵机,每个需要一路PWM 波和两路电源输入。
电源输入标准为5V 1-8A ,采用带输入和输出保护的50w 开关电源供电;PWM 波为50Hz ,正脉冲时间为0.5-2.5ms ,对应-90°至90°(实际使用中为了保护机械,为0.7-2.3ms ,舵机旋转范围为-70°至70°)。
由于系统对于输出的频率有5Hz 的限制,因此使用软件延迟来实现最多八路的的PWM 波输出。
PWM 波由MCU 通过软件延时产生,算法概述如下(流程图见附件):1. A 路输出2.5ms 脉冲(输出正脉冲,不足时间由低电平 补至2.5ms ),此时其他五路无输出,相当于输出2.5ms 低电平; 2. B 路输出2.5ms 脉冲(同A 路,不足时间由低电平补齐),此时包括A 路的其他五路无输出,相当于输出2.5ms 低电平;3. 同理,输出C,D,E,F 路4. 此时,1-3步总时间为2.5*6=15ms ,其中每路由一个小于2.5ms 的正脉冲和低电平时间组成。
由于输出周期为20ms ,故应再输出20ms-15ms=5ms 低电平时间,使得各路频率为50Hz 。
重复1-3步,得到输出波形如下图:(仅以4路为例,使用Proteus 仿真示波器,图2.2.2)可以看到,此时各路输出均为50Hz ,正脉冲时间为0.5-2.5ms图 2.2.1 舵机及其控制原理图2.2.2 Proteus仿真此算法在50Hz(20ms)频率的限制下,最多可输出8路PWM波形(8*2.5ms=20ms)三、实际程序程序如下:#include <stdio.h>#include <REG52.h>#define uchar unsigned char#define uint unsigned intsbit Out1=P2^0;sbit Out2=P2^1;sbit Out3=P2^2;sbit Out4=P2^3;sbit Out5=P2^4;void PWM(uint a, uint b,uint c, uint d,uint e) {uchar A,B,C,D,E;uint M=984;A=250-a;B=250-b;C=250-c;D=250-d;E=250-e;do { Out1 = 1; } while(a--);do { Out1 = 0; } while(A--);do { Out2 = 1; } while(b--);do { Out2 = 0; } while(B--);do { Out3 = 1; } while(c--);do { Out3 = 0; } while(C--);do { Out4 = 1; } while(d--);do { Out4 = 0; } while(D--);do { Out5 = 1; } while(e--);do { Out5 = 0; } while(E--);do{ }while(M--);}main()uchar a,b,c,d,e;uint m;a=170;b=149;c=d=e=149;SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1 TMOD = 0x20; //定时器工作方式2PCON = 0x80;//TH1 = 0xFD; //baud*2 /* reload value 19200、数据位8、停止位1。
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}。