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

PWM调速C程序编写

PWM调速C程序编写
通过定时器模拟!可以通过两个定时器,T0控制周期,T1控制占空比。
例如:实现周期为1000us,占空比为20%的PWM,用PA0实现
首先设置T0为83 (11.0592M晶振)
T1为65501
首先初始化PA0=1,两个定时器同时打开,在定时器T1中断时拉低PA0,
在定时器T0中断时在拉高PA0,同时将两定时器初始值初始化T0为83,T1为65501
一开始设置PA0为高电平,当count1加到200的时候拉低PA0,
等count1到1000了在拉高PA0,同时复位count1=0,
不过这样做的缺点是精度不高,要是PWM所需周期段,精度高的话还是用两个定时器来实现;
************************************************/
SREG=0x80;
while(1);
}
#pragma vector = TIMER0_OVF_vect
__interrupt void TIMER0_OVF(void)
{
PWM_PA0=1;
TCNT0=0x53;
}
#pragma vector = TIMER1_OVF_vect
__interrupt void TIMER1_OVF(void)
}
void timer0_init(void)
{
SREG=0x80;
TIMSK|=(1<<TOIE0);
TCCR0|=(0<<CS02)|(0<<CS01)|(1<<CS00);
TCNT0=0x91;
}
void main(void)
{
port_init();

基于单片机用软件实现直流电机PWM调速系统

基于单片机用软件实现直流电机PWM调速系统

基于单片机用软件实现直流电机PWM调速系统基于单片机用软件实现直流电机PWM调速系统摘要:本篇文章介绍了一种基于单片机的直流电机PWM调速系统的设计与实现。

通过使用单片机作为主控制器,结合软件编程实现对直流电机的调速。

文章首先介绍了直流电机的基本结构和工作原理,然后详细介绍了PWM调速的原理和方法。

接下来,本文详细说明了单片机的选择和电机驱动电路设计,以及软件编程的过程和关键代码。

最后,作者通过搭建实验平台并进行实验验证,证明了该系统可以稳定、精确地实现对直流电机的调速。

关键词:单片机、直流电机、PWM调速、控制系统、软件编程引言随着科技的不断发展和应用领域的不断拓展,直流电机作为一种常见的电动机,在各行各业都得到了广泛应用。

然而,在一些特殊需求的项目中,我们需要对直流电机进行精确的调速控制。

传统的调速方法通常是通过改变电机的输入电压来达到调速的目的,但这样的方法在效率和精确度方面存在一定的不足。

因此,基于单片机的软件实现直流电机PWM调速系统逐渐成为了一种较为常见的解决方案。

一、直流电机基本结构和工作原理直流电机是一种电能转换为机械能的装置,广泛应用于工业、交通以及家电等领域。

直流电机的基本结构由定子、转子和刷子组成。

当通过电源施加在定子上的直流电流经过转子和刷子后形成磁场,磁场作用于转子,使转子产生转动。

二、PWM调速原理和方法PWM(Pulse Width Modulation)调制是指将模拟信号转化为脉冲信号的一种技术。

通过改变脉冲的占空比,可以在保持信号频率不变的情况下实现对平均信号幅值的调节,从而实现对电机的调速。

调速的原理是通过改变电机的工作周期和停止周期的比例来改变电机的平均输出功率。

三、单片机的选择和电机驱动电路设计在实现直流电机PWM调速系统中,单片机是关键的控制器。

本文选择使用常见的STC系列的单片机,其具有低功耗、高性能和丰富的外设接口的优点。

电机驱动电路设计主要包括电池供电电路、电平转换电路、电流检测电路和驱动芯片电路等。

单片机PWM调光程序

单片机PWM调光程序

单片机PWM调光程序一、概述PWM(Pulse Width Modulation,脉宽调制)是一种常用的调光技术,通过控制信号的脉冲宽度来调节输出电平的平均值,从而实现对光源亮度的调节。

本文将介绍如何编写单片机PWM调光程序,并提供一个基于XX单片机的示例代码。

二、硬件准备1. 单片机:XX单片机(型号)2. 光源:LED灯(型号)3. 光敏电阻:用于实时检测环境光强度的元件4. 电路连接:将单片机的PWM输出引脚连接到LED灯的控制引脚,将光敏电阻连接到单片机的模拟输入引脚三、软件设计1. 引入头文件:根据单片机型号,引入相应的头文件,例如"xx.h"。

2. 定义宏:定义LED灯的控制引脚和光敏电阻的模拟输入引脚。

3. 初始化:设置单片机的引脚模式和PWM参数,例如设置PWM频率、占空比等。

4. 光敏检测:通过模拟输入引脚读取光敏电阻的电压值,将其转换为环境光强度的数值。

5. PWM调光:根据光敏检测到的环境光强度数值,计算对应的PWM占空比,并将其输出到LED灯的控制引脚。

四、示例代码```c#include <xx.h> // 引入相应的头文件#define LED_PIN 1 // 定义LED灯的控制引脚#define LDR_PIN 2 // 定义光敏电阻的模拟输入引脚void init_pwm() {// 设置引脚模式为PWM输出pinMode(LED_PIN, PWM_OUTPUT);// 设置PWM参数pwmSetMode(PWM_MODE_MS);pwmSetClock(100); // 设置PWM频率为100HzpwmSetRange(1024); // 设置PWM占空比范围为0-1024 }int read_ldr() {// 读取光敏电阻的电压值int ldr_value = analogRead(LDR_PIN);// 根据电压值转换为环境光强度数值int light_intensity = map(ldr_value, 0, 1023, 0, 100);return light_intensity;}void adjust_brightness(int light_intensity) {// 根据环境光强度计算PWM占空比int pwm_duty_cycle = map(light_intensity, 0, 100, 0, 1023);// 输出PWM占空比到LED灯的控制引脚pwmWrite(LED_PIN, pwm_duty_cycle);}int main() {init_pwm(); // 初始化PWMwhile (1) {int light_intensity = read_ldr(); // 光敏检测adjust_brightness(light_intensity); // PWM调光}return 0;}```五、使用方法1. 将示例代码中的XX单片机型号替换为实际使用的单片机型号。

PWM直流电机调速单片机程序

PWM直流电机调速单片机程序

*******************************************************************/ /* 程序名:PWM直流电机调速 *//* 晶振:11.00592 MHz CPU型号:AT89C51 *//* 直流电机的PWM波控制,可以直接的调速从0到20级的调速 *//*****************************************************************/ #include<reg51.h>#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输出时间间隔}/*******按键处理加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 = ~Flag;}while(!Key_turn);}/***********定时器0初始化***********/void Timer0_init(void){TMOD=0x01; //定时器0工作于方式1TH0=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;}elsePWM2 = 0;if(count1 >= 100){count1=0;}}else //电机反转{PWM2 = 0;if(++count1 < count0){PWM1 = 1;}elsePWM1 = 0;if(count1 >= 100){count1=0;}}}//-----------------------------------------------------------------------------#include <c8051f330.h> // SFR declarations#include <math.h>// Function Prototypes//-----------------------------------------------------------------------------#define CMD_RESET 0xA4 //HD7279复位#define DECODE1 0xc8 //方式0译码sbit cs=P1^3;sbit clk=P1^2;sbit dat=P1^1;sbit key=P1^0;sbit led_D1003=P0^7;sbit sw1=P1^7;sbit sw2=P1^6;sbit sw3=P1^5;sbit sw4=P1^4;void long_delay(void); //延时函数void short_delay(void);void delay10ms(unsigned char);void write7279(unsigned char,unsigned char); //HD7279写指令void send_byte(unsigned char);void delay(unsigned char);void disp1(unsigned int);void OSCILLATOR_Init (void);void PORT_Init (void);void PCA0_Init (void);void Timer0_Init(void);void Ext_Interrupt_Init (void);//-----------------------------------------------------------------------------// Global Variables//-----------------------------------------------------------------------------//-----------------------------------------------------------------------------// main() Routine//-----------------------------------------------------------------------------unsigned int CEX0_Compare_Value; // Holds current PCA compare valueunsigned int tmr,Speed_evaluate;unsigned char num,num1,num2,num3,a;unsigned int Speed,pi,Speed2;unsigned int Speed1[10];typedef struct {double SetPoint; /* 设定目标Desired Value */double Proportion; /* 比例常数Proportional Const */double Integral; /* 积分常数Integral Const */double Derivative; /* 微分常数Derivative Const */double LastError; /* 前一项误差*/double PrevError; /* 前第二项误差*/double SumError; /* 误差和*/} PID;double PIDCalc( PID *pp, double NextPoint ){double dError,Error,Pout;Error = pp->SetPoint - NextPoint; /* ?????? */pp->SumError += Error; /* ??????/dError = pp->LastError - pp->PrevError; /* ???? */pp->PrevError = pp->LastError;pp->LastError = Error; /* ??????? */Pout= pp->Proportion * Error + pp->Integral * pp->SumError +pp->Derivative * dError ;if(Pout>1100)Pout=1000;if(Pout<100)Pout=100;return (Pout);}PID sPID; //定义PID结构体变量double rOut; //PID响应输出unsigned char rIn; //设置PID反馈值double x;double sumout;unsigned char dd;//设置PID输出void main (void){sPID.Proportion = 0.44; //设置PsPID.Integral = 0.70; //设置IsPID.Derivative = 0.0; //设置D//sPID.SetPoint = CEX0_Compare_Value;//sPID.SetPoint = CEX0_Compare_Value; //设置PID输出PCA0MD = 0x00; // Disable watchdog timerled_D1003=0;PORT_Init (); // Initialize crossbar and GPIO OSCILLATOR_Init (); // Initialize oscillatorPCA0_Init (); // Initialize PCA0IP=0x82; //定时器中断0高于外部中断0Timer0_Init();Ext_Interrupt_Init ();for (tmr=0;tmr<0x2000;tmr++);send_byte(CMD_RESET);//HD7279复位// Globally enable interrupts EA = 1;sPID.SetPoint=70;while (1){delay10ms(100);//键盘程序------------------------------------------------------------- if(sw1==0) //按键1是否按下{if(sw1==0)//再次检查按键{num++; //若按键按下,num加1if(num==1) //到9归0{num=0;}while(sw1==0);//按键释放}// delay10ms(100);}write7279(DECODE1+4,num); //将num写入HD7279第1位 delay10ms(1);if(sw2==0){if(sw2==0){num1++;if(num1==2){num1=0;}while(!sw2);}// delay10ms(100);}write7279(DECODE1+5,num1);//将num1写入HD7279第2位delay10ms(1);if(sw3==0){if(sw3==0){num2++;if(num2==10){num2=0;}while(!sw3);}// delay10ms(100);}write7279(DECODE1+6,num2);//将num1写入HD7279第2位delay10ms(1);if(sw4==0){if(sw4==0){num3++;if(num3==10){num3=0;}while(!sw4);}// delay10ms(100);}write7279(DECODE1+7,num3);//将num1写入HD7279第2位delay10ms(1);Speed_evaluate=num*1000+num1*100+num2*10+num3;sPID.SetPoint=Speed_evaluate;//控制程序-----------------------------------------------------------------//---------------------------------------------------------------------------}}void OSCILLATOR_Init (void){OSCICN = 0x83; // Set internal oscillator torun// at its maximum frequencyCLKSEL = 0x00;}void PORT_Init (void){XBR0 = 0x00;XBR1 = 0x41;// Enable crossbar and weak pull-upsP0MDOUT |= 0x10; // Set CEX0 (P0.4) to push-pull P0SKIP |=0x0F; //P1SKIP = 0x00;P1MDOUT= 0x0f;}void PCA0_Init (void){PCA0CN = 0x00; // Stop counter; clear all flagsPCA0MD = 0x01; // Use Ettern ime basePCA0CPM0 = 0xCB; // Module 0 = 16-bit PWM mode and// enable Module 0 Match and Interrupt// Flags// Configure initial PWM duty cycle = 50%CEX0_Compare_Value = 65536 - (65536 * 0.15);PCA0CPL0 = (CEX0_Compare_Value & 0x00FF);PCA0CPH0 = (CEX0_Compare_Value & 0xFF00)>>8;EIE1 |= 0x10; // Enable PCA interrupts// Start PCA counterCR = 1;}void Ext_Interrupt_Init (void){TCON |= 0x05; // /INT 0 and /INT 1 are edge triggeredIT01CF = 0x10; // /INT0 active low; /INT0 on P0.0;// /INT1 active low; /INT1 on P0.1EX0 = 1; // Enable /INT0 interrupts}void Timer0_Init(void){TH0 = 0 ; // Init Timer0 High registerTL0 = 0 ; // Init Timer0 Low registerTMOD |= 0x01; // Timer0 in 16-bit mode方式1CKCON |= 0x02; // Timer0 uses a 1:48 prescalerET0 = 1; // Timer0 interrupt enabledTCON|=0x10;// Timer0 ON}// PCA0_ISR//-----------------------------------------------------------------------------void PCA0_ISR (void) interrupt 11{CCF0 = 0; // Clear module 0 interrupt flag.PCA0CPL0 = (CEX0_Compare_Value & 0x00FF);PCA0CPH0 = (CEX0_Compare_Value & 0xFF00)>>8;}void Timer0_ISR (void) interrupt 1 {int j,sum;TF0=0;// Clear interrupt flag.a++;if (a==4){Speed1[pi]=Speed;if(pi>=3){ EX0 = 0;for(j=0;j<=3;j++){sum=sum+Speed1[j];}Speed2=sum/4;disp1(Speed2);Speed=0;pi=0;EX0 = 1;}a=0;sum=0;if(pi>=3)pi=0;elsepi++;TH0 = 0; // Reinit Timer0 High register TL0 = 0; // Reinit Timer0 Low registerif(abs( sPID.SetPoint-Speed2)<=5) {CEX0_Compare_Value=CEX0_Compare_Value;}else{rIn =Speed2; for(dd=0;dd<50;dd++)x=rIn;//x = 5.0 * (double)rIn / 256.0;rOut = PIDCalc ( &sPID,x );// sumout=rOut*256/5;if(rOut==100)sumout=0;elsesumout= (0.85/1000.0)*rOut;//CEX0_Compare_Value=CEX0_Compare_Value-sumout;CEX0_Compare_Value = 65536 - (65536 * ( sumout+0.15));}}else{TH0 = 0; // Reinit Timer0 High registerTL0 = 0; // Reinit Timer0 Low register}}void INT0_ISR (void) interrupt 0{IE0=0; // // Clear interrupt flag.Speed++;}void write7279(unsigned char cmd, unsigned char dta) {send_byte(cmd);send_byte(dta);}void send_byte( unsigned char out_byte){unsigned char i;cs=0;long_delay();for (i=0;i<8;i++){if (out_byte&0x80){dat=1;}else{dat=0;}clk=1;short_delay();clk=0;short_delay();out_byte=out_byte*2; }dat=0;}void long_delay(void){unsigned char i;for (i=0;i<0x30;i++);}void short_delay(void){unsigned char i;for (i=0;i<8;i++);}void delay10ms(unsigned char time) {unsigned char i;unsigned int j;for (i=0;i<time;i++){for (j=0;j<0x390;j++);}}void disp1(unsigned int date){unsigned char d0, d1, d2 , d3; d0=date / 1000;d1=(date-d0*1000)/100;d2=(date-d0*1000-d1*100)/10 ;d3= date-d0*1000-d1*100-d2*10;write7279(DECODE1,d0);delay10ms(1);write7279(DECODE1+1,d1);delay10ms(1);write7279(DECODE1+2,d2);delay10ms(1);write7279(DECODE1+3,d3);delay10ms(1);}。

基于单片机的PWM变频调速设计。

基于单片机的PWM变频调速设计。

基于单片机的PWM变频调速系统设计(只要肯花20财富值下载此文档,我就给你proteus仿真电路图,.hex文件和完整程序下载后加好友并注明百度课程设计文档,我就发文件压缩包,在我的百度云盘里。

)摘要:本文研究了利用at89c51单片机控制PWM信号从而实现对直流伺服电机转速进行控制的方法。

文中对PWM信号的调速原理做了详细的论述。

此外,系统中采用了芯片L298作为直流伺服电机的驱动模块,完成了在主电路中对直流电机的控制。

另外,文中介绍了Proteus的使用,并对该调速系统做了仿真。

鉴于Proteus7.1版本不能直接使用C语言进行仿真,采用了Keil生成了Hex文件,并导入到Protues工程中进行仿真。

最后,文中详细给出了电路图和c语言程序关键词:PWM调速;单片机;直流伺服电机目录第一章概述 (4)1.1 PWM调速系统的组成和功能 (4)1.1.1 PWM信号发生与调节模块 (4)1.1.2 PWM信号放大与电机驱动模块 (5)1.1.3 负载模块 (5)1.2 单片机概述 (5)1.2.1 单片机及其发展历程 (5)1.2.2 单片机的应用领域及发展趋势 (5)1.3 计算机仿真概述 (6)第二章 PWM调速技术 (7)2.1 PWM的基本原理 (7)2.1.1 PWM信号简介 (7)2.1.2 PWM调速原理 (8)2.2 系统设计方案 (9)2.2.1 系统总体设计思想 (9)2.2.2 系统总体设计框图 (9)第三章 PWM调速系统设计 (10)3.1 系统硬件设计 (10)3.1.1 主电路设计 (10)3.1.2 AT89C51单片机简介 (10)3.1.3 功率放大驱动芯片介绍 (13)3.1.4 伺服电机介绍 (14)3.2 系统软件设计 (16)3.2.1 程序流程图 (16)3.2.2 C语言程序设计 (16)3.3 PWM调速系统仿真 (19)3.3.1 系统仿真电路图 (19)3.3.2 电压输出波形 (19)第四章总结 (21)参考文献 (22)致谢 (23)第一章概述本文主要研究了利用与MCS-51兼容的at89c51单片机,通过PWM方式控制直流电机调速的方法。

基于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。

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

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

基于单片机AT89S52的直流电机PWM调速控制系统一、背景介绍在工业自动化控制中,直流电机的使用非常广泛。

为了满足生产需要,直流电机往往需要精确的调速控制。

而基于单片机AT89S52的直流电机PWM调速控制系统,能够进行精确的调速控制,能够满足不同领域生产的需求。

二、系统的工作原理基于单片机AT89S52的直流电机PWM调速控制系统,是通过单片机的输出比较器和计数器,生成PWM信号,对直流电机进行调速控制。

系统的工作流程如下: 1. 将单片机的一个IO口设置为输出端口,将PWM信号输出至直流电机控制器。

2. 单片机通过PWM的工作状态,实现对直流电机的调速控制。

3. 接收外部信号,如光电传感器等外部元件信号,与单片机实现互动控制。

三、系统的硬件结构基于单片机AT89S52的直流电机PWM调速控制系统,主要由以下硬件构成:1. 单片机:AT89S52单片机。

2. 驱动芯片:L293D电机驱动芯片,能够带动2个直流或步进电机。

3. 直流电机:具有恒定转速输出的直流电机。

4. 供电模块:通过电源模块将工作电压稳定输出,以保证整个系统的稳定性。

四、系统的软件设计在基于单片机AT89S52的直流电机PWM调速控制系统中,需要进行相应的软件设计,以实现对硬件的完备控制。

### 1. 硬件方面的编写初始化单片机及端口、占用模式、管脚监听、中断响应等基本操作。

2. 软件方面的实现1.通过控制器计数器以及方波控制直流电机的执行速度。

2.利用定时器产生PWM波控制直流电机的状态。

3.通过IO控制输出、接收外部信号。

3. 控制程序的实现检测输出端口,通过输入数据产生PWM波,通过PWM波控制电离子的转速。

五、系统的应用场景基于单片机AT89S52的直流电机PWM调速控制系统,可广泛应用于以下场景: 1. 机床设备制造领域,能够对机床电机的转速进行精确控制。

2. 汽车制造领域,能够对汽车电动马达的转速进行精确控制,从而提升汽车驾驶体验。

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)专业名称 07级通信工程实验日期 2009年11月27日 班级 02班 指导教师 苏文静实验地点 机电楼408实验目的1.了解直流电机PWM的工作原理2.基础要求:编程并实现直流电机的调速,LED显示电机的转速,即电位器输出(开环)3.扩展要求:编程并实现直流电机的调速,以SPEED口输出的信号为反馈显示电机的实际转速(闭环)实验原理1.PWM的调速原理PWM调速是通过改变输出脉冲的占空比,从而改变电机转速的一种调速方法。

PWM调速分为单极性和双极性两种。

在单极性方式下,电机的转动方向不变,改变的只是转速;而在双极性方式下,电机的转动方向和转速都是可变的。

以下以单极性为 例说明PWM调速的基本原理。

假设一个脉冲周期内,高电平电压为Us,持续时间为t1;低电平为0V,持续时间为t2。

则脉冲周期T=t1+t2,该周期内平均电压U0=t1*Us/T。

令α=t1/T,则U0=α*Us,α表示占空比。

当高电平电压不变的情况下,电机两端电压的平均值U0取决于占空比α的大小。

改变α值就可以改变端电压的平均值,从而达到调速的目的,这就是PWM调速原理。

在双极性方式下,如果U0为负,意味着电机将反转,转速由U0的绝对值控制。

2.对象模块(PWM电机调速模块)工作原理直流电机PWM调速模块由测速电路和PWM调速电路两部分组成。

模块的电源由接口总线引入。

本模块中使用的电机为5V的直流电机。

电机测速部分(1)直流电机测速原理介绍电机测速部分由一个霍尔开关和信号放大电路组成。

与电机同轴的转盘上装有两块的强力磁钢,它们的磁极性相反,以保持转盘的平衡并保证转盘每转一周霍尔开关只导通一次。

霍尔开关平时输出为正电压,当转盘上的磁钢与霍尔开关正对时,霍尔开关输出负电压,经整形、放大输出。

单片机通过对负脉冲计数,可计算出电机的转速。

(2)电机测速部分电路原理及说明3144为霍尔开关,整形、放大由LM358完成。

51单片机控制直流电机调速系统流程图:

51单片机控制直流电机调速系统流程图:

51单片机控制直流电机调速系统流程图:
题目:单片机控制直流电机调速系统——软件设计
1. 编一段显示程序分别显示当前的转速和我们所需要的转速。

显示用4段数码管来实现。

2:编一段PWM调速的程序,来控制脉冲的宽度从而来控制电机的转速。

3:通过霍尔传感器测速,利用霍尔把信号传给单片机,单片机利用计数器的功能来记录转速,并同时把转速用数码管显示出来。

4:由于真实的转速和我们所设订的转速可能存在很大的误差,所以要编一段PID调速的程序,通过PID调节来减少误差。

5.要3个按键,键1实现设定转速的功能,键2实现切换功能(从所设定的转速切换到真实的转速的显示,键3实现开关的功能。

基于单片机的PWM直流电机调速系统设计论文附电路图、程序清单

基于单片机的PWM直流电机调速系统设计论文附电路图、程序清单

第1章引言1.1 概况现代工业的电力拖动一般都要求局部或全部的自动化,因此必然要与各种控制元件组成的自动控制系统联系起来,而电力拖动则可视为自动化电力拖动系统的简称。

在这一系统中可对生产机械进行自动控制。

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

以达到高速、优质、高效率地生产。

在大多数综合自动化系统中,自动化的电力拖动系统仍然是不可缺少的组成部分。

另外,低成本自动化技术与设备的开发,越来越引起国内外的注意。

特别对于小型企业,应用适用技术的设备,不仅有益于获得经济效益,而且能提高生产率、可靠性与柔性,还有易于应用的优点。

自动化的电力拖动系统更是低成本自动化系统的重要组成部分。

在如今的现实生活中,自动化控制系统已在各行各业得到广泛的应用和发展,其中自动调速系统的应用则起着尤为重要的作用。

虽然直流电机不如交流电机那样结构简单、价格便宜、制造方便、容易维护,但是它具有良好的起、制动性能,宜于在广泛的范围内平滑调速,所以直流调速系统至今仍是自动调速系统中的主要形式。

现在电动机的控制从简单走向复杂,并逐渐成熟成为主流。

其应用领域极为广泛,例如:军事和宇航方面的雷达天线、火炮瞄准、惯性导航等的控制;工业方面的数控机床、工业机器人、印刷机械等设备的控制;计算机外围设备和办公设备中的打印机、传真机、复印机、扫描仪等的控制;音像设备和家用电器中的录音机、数码相机、洗衣机、空调等的控制。

随着电力电子技术的发展,开关速度更快、控制更容易的全控型功率器件MOSFET 和IGBT成为主流,脉宽调制技术表现出较大的优越性:主电路线路简单,需要用的功率元件少;开关频率高,电流容易连续,谐波少,电机损耗和发热都较小;低速性能好,稳速精度高,因而调速范围宽;系统快速响应性能好,动态抗扰能力强;主电路元件工作在开关状态,导通损耗小,装置效率较高;近年来,微型计算机技术发展速度飞快,以计算机为主导的信息技术作为一崭新的生产力,正向社会的各个领域渗透,直流调速系统向数字化方向发展成为趋势。

c单片机C语言编写的PWM程序

c单片机C语言编写的PWM程序

89c51单片机C语言编写的PWM程序PWM, 单片机, C语言, 程序, 编写分享到:新浪微博 QQ空间开心网人人网说明:本程序使用STC89C52RC单片机,22.1184MHz晶振,要使用本程序需要自己修改,我是用来控制直流电机的,外接了L298驱动电路,有问题或意见请回复,谢谢^_^#include "reg52.H"#include "MyType.h"//=============L298端口定义===============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自增变量/****************************************************************** 名称:motor(char speed1,char speed2);功能:同时调节电机的转速参数:speed1:电机1的PWM值;speed2:电机2的PWM值?? speed>0.正转;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;?//定时0.1ms? ?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直流电机调速系统设计论文(附电路图、程序清单)

基于单片机的PWM直流电机调速系统设计论文(附电路图、程序清单)

图 2.2 直流电机原理图
2.2 直流电机的调速方法
根据直流电机的基本原理,由感应电势、电磁转矩以及机械特性方程式可知,直 流电动机的调速方法有三种: (1)调节电枢供电电压 U。改变电枢电压主要是从额定电压往下降低电枢电压, 从电动机额定转速向下变速,属恒转矩调速方法。对于要求在一定范围内无级平滑调 速的系统来说,这种方法最好。 大容量可调直流电源。 (2)改变电动机主磁通 。改变磁通可以实现无级平滑调速,但只能减弱磁通进 变化时间 变化遇到的时间常数较小,能快速响应,但是需要
第1章 引 1.1 概况

现代工业的电力拖动一般都要求局部或全部的自动化,因此必然要与各种控制元 件组成的自动控制系统联系起来,而电力拖动则可视为自动化电力拖动系统的简称。 在这一系统中可对生产机械进行自动控制。 随着近代电力电子技术和计算机技术的发展以及现代控制理论的应用,自动化电 力拖动正朝着计算机控制的生产过程自动化的方向迈进。以达到高速、优质、高效率 地生产。在大多数综合自动化系统中,自动化的电力拖动系统仍然是不可缺少的组成 部分。另外,低成本自动化技术与设备的开发,越来越引起国内外的注意。特别对于 小型企业,应用适用技术的设备,不仅有益于获得经济效益,而且能提高生产率、可 靠性与柔性,还有易于应用的优点。自动化的电力拖动系统更是低成本自动化系统的 重要组成部分。 在如今的现实生活中,自动化控制系统已在各行各业得到广泛的应用和发展,其 中自动调速系统的应用则起着尤为重要的作用。虽然直流电机不如交流电机那样结构 简单、价格便宜、制造方便、容易维护,但是它具有良好的起、制动性能,宜于在广 泛的范围内平滑调速,所以直流调速系统至今仍是自动调速系统中的主要形式。现在 电动机的控制从简单走向复杂,并逐渐成熟成为主流。其应用领域极为广泛,例如: 军事和宇航方面的雷达天线、火炮瞄准、惯性导航等的控制;工业方面的数控机床、 工业机器人、印刷机械等设备的控制;计算机外围设备和办公设备中的打印机、传真 机、复印机、扫描仪等的控制;音像设备和家用电器中的录音机、数码相机、洗衣机、 空调等的控制。 随着电力电子技术的发展, 开关速度更快、 控制更容易的全控型功率器件MOSFET 和IGBT成为主流,脉宽调制技术表现出较大的优越性:主电路线路简单,需要用的功 率元件少;开关频率高,电流容易连续,谐波少,电机损耗和发热都较小;低速性能 好,稳速精度高,因而调速范围宽;系统快速响应性能好,动态抗扰能力强;主电路 元件工作在开关状态,导通损耗小,装置效率较高;近年来,微型计算机技术发展速

51单片机直流电机PWM调速程序

51单片机直流电机PWM调速程序

* 程序思路说明:*关于频率和占空比的确定,对于12M晶振,假定PWM输出频率为1KHZ,这样定时中断次数**设定为C=10,即0.01MS中断一次,则TH0=FF,TL0=F6;由于设定中断时间为0.01ms,这样**可以设定占空比可从1-100变化。

即0.01ms*100=1ms * ******************************************************************************/#include <REGX51.H>/****************************************************************************** TH0和TL0是计数器0的高8位和低8位计数器,计算办法:TL0=(65536-C)%256;** TH0=(65536-C)/256,其中C为所要计数的次数即多长时间产生一次中断;TMOD是计数器** 工作模式选择,0X01表示选用模式1,它有16位计数器,最大计数脉冲为65536,最长时* * 间为1ms*65536=65.536ms* P1_0、P1_1为输入逻辑信号控制端,控制电机Motor 1;******************************************************************************/#define V_TH0 0XFF#define V_TL0 0XF6#define V_TMOD 0X01void init_sys(void); /*系统初始化函数*/unsigned char ZKB1; /*占空比变量*/void main (void){init_sys();ZKB1=40; /*占空比初始值设定*/P1_1=1;P1_0=0;while(1);}/*******************************************************函数功能:对系统进行初始化,包括定时器初始化和变量初始化*/void init_sys(void) /*系统初始化函数*/{/*定时器初始化*/TMOD=V_TMOD;TH0=V_TH0;TL0=V_TL0;TR0=1;ET0=1;EA="1";}/*中断函数*/void timer0(void) interrupt 1{Unsigned char click;TH0=V_TH0; /*恢复定时器初始值*/TL0=V_TL0;++click;if (click>=100) click=0;if (click<=ZKB1) /*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/P1_1=0;elseP1_1=1;}。

BLDC驱动器单片机PWM波及脉冲调速实现方案

BLDC驱动器单片机PWM波及脉冲调速实现方案

BLDC驱动器单片机PWM波及脉冲调速实现方案1.1 单片机控制方式典型接法1.1.1 单片机PWM信号调速方式此接法可实现通过单片机输出PWM信号对电机调速,通过单片机IO信号控制控制启停和正反转,通过限位开关对正反转分别进行限位。

单片机PWM信号占空比/闭环调速方式典型接法如图0.1所示。

驱动器的COM与单片机的电源地相连;IN1接单片机的PWM 的输出,用于调速;IN2和IN3与单片机的两个分别IO相连,分别用于控制电机正反转及紧急制动。

限位开关SQ1和SQ2分别对正反转进行限位。

图0.1 单片机PWM信号占空比/闭环调速方式的接法单片机PWM信号占空比/闭环调速方式下,驱动器支持占空比调速、力矩控制和速度闭环控制。

拨码开关配置方法如图0.2所示,其中,第1-3位配置电机额定电流(如何配置电机的额定电流见错误!未找到引用源。

);第4-5位配置信号源(如何配置信号源见错误!未找到引用源。

),我们将信号源配置为PWM/脉冲信号,即第4位拨到OFF ,第5位拨到ON ;第6-7位配置工作模式(如何配置工作模式见错误!未找到引用源。

),第8位配置控制方式,我们将控制方式配置为数字/模拟信号控制方式,即第8位拨到OFF 。

拨码开关拨到上方为ON ,下方为OFF 。

从左至右依次是第1-8位。

第6-8位均第4位拨到第5位拨到第7-8位拨到OFF单片机PWM 信号占空比调速单片机PWM 信号信号速度闭环调速单片机PWM 信号力矩控制调速第4位拨第5-6位拨到ON第4位拨到OFF 第5位拨第6位拨到第7位拨到第8位拨到图 0.2 单片机PWM 信号占空比调速/力矩控制/闭环调速方式的拨码开关配置单片机PWM 信号调速方式下,相关寄存器的参考配置如表 0.1所示。

表 0.1 单片机PWM 信号调速方式相关寄存器的配置1.1.2 单片机脉冲信号位置控制此接法可实现在单片机使用脉冲信号控制电机转动位置。

单片机脉冲信号位置控制的典型接法图 0.3所示。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档