导航:首页 > 操作系统 > 基于单片机的直流电机转速控制

基于单片机的直流电机转速控制

发布时间:2022-06-24 00:32:01

单片机控制直流电机速度

if(j<=count)
{
PWM=1;
delayus(20); //改变这个延时时间长短可以改变电机速度
}
else
{
PWM=0;
delayus(10); //同理
}
//比如延时时间一样,那么占空比为50%,以上占空比为67%,所以速度提高了。

Ⅱ 关于单片机控制直流电机转速的问题

摘要
i
abstract
ii
1
概述
1
1.1
课题研究背景及意义
1
1.2
直流电机控制现状及发展趋势
2
1.3
课题任务与研究内容
3
2
直流电机控制方案的确定
5
2.1
直流电动机调速方法的选择
5
2.2
调压调速方法的选择
7
2.3
pwm调速控制原理
10
2.4
驱动方式的选择
11
2.5
伺服系统控制方案的选择
13
3
控制系统matlab/simulink建模仿真
16
3.1
matlab动态仿真工具simulink简介
16
3.2
仿真参数计算
16
3.3
模型建立与仿真结果分析
18
4
系统硬件电路设计
27
4.1
系统硬件结构概述
27
4.2
主电路设计
27
4.3
tms320lf2407控制器
30
4.4
检测电路设计
32
4.5
ipm驱动控制电路设计
34
4.6
故障综合电路设计
35
4.7
dsp-pc机通信电路设计
36
5
系统软件设计
37
5.1
dsp软件开发工具ccs简介
37
5.2
软件设计概述
38
5.3
主程序
40
5.4
pwm波形输出程序
41
5.5
电枢电流检测程序
42
5.6
转速检测程序
42
5.7
dsp-pc通信程序
43
5.8
调节器程序
44
5.9
中断处理程序
46
总结
47
参考文献
48
附录
50


51

Ⅲ 如何用单片机控制直流电机

通过与单片机相连的按键控制直流电机停启的电路如下图所示,通过P3.6口按键触发启动直流电机,P3.7口的按键触发停止直流电机的运行。由图可知,当P1.0输出高电平“1”时,NPN型三极管导通,直流电机得电转动;当P1.0输出低电平“0”时,NPN型三极管截止,直流电机停止转动。

(3)基于单片机的直流电机转速控制扩展阅读:

通过单片机产生PWM波控制直流电机程序

#include "reg52.h"


#define uchar unsigned char


#define uint unsigned int


uchar code table[10]={0x3f,0x06,0x5b,


0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴数码管显示码(0-9)


sbit xiaoshudian=P0^7;


sbit wei1=P2^4; //数码管位选定义


sbit wei2=P2^5;


sbit wei3=P2^6;


sbit wei4=P2^7;


sbit beep=P2^3; //蜂鸣器控制端


sbit motor = P1^0; //电机控制


sbit s1_jiasu = P1^4; //加速按键


sbit s2_jiansu= P1^5; //减速按键


sbit s3_jiting=P1^6; //停止/开始按键


uint pulse_count; //INT0接收到的脉冲数


uint num=0; //num相当于占空比调节的精度


uchar speed[3]; //四位速度值存储


float bianhuasu; //当前速度(理论计算值)


float reallyspeed; //实际测得的速度


float vv_min=0.0;vv_max=250.0;


float vi_Ref=60.0; //给定值


float vi_PreError,vi_PreDerror;


uint pwm=100; //相当于占空比标志变量


int sample_time=0; //采样标志


float v_kp=1.2,v_ki=0.6,v_kd=0.2; //比例,积分,微分常数


void delay (uint z)


{


uint x,y;


for(x=z;x>0;x--)


for (y=20;y>0;y--);


}


void time_init()


{


ET1=1; //允许定时器T1中断


ET0=1; //允许定时器T0中断


TMOD = 0x15; //定时器0计数,模式1;定时器1定时,模式1


TH1 = (65536-100)/256; //定时器1值,负责PID中断 ,0.1ms定时


TL1 = (65536-100)%6;


TR0 = 1; //开定时器


TR1 = 1;


IP=0X08; //定时器1为高优级


EA=1; //开总中断


}


void keyscan()


{


float j;


if(s1_jiasu==0) //加速


{


delay(20);


if(s1_jiasu==0)


vi_Ref+=10;


j=vi_Ref;


}


while(s1_jiasu==0);


if(s2_jiansu==0) //减速


{


delay(20);


if(s2_jiansu==0)


vi_Ref-=10;


j=vi_Ref;


}


while(s2_jiansu==0);


if(s3_jiting==0)


{


delay(20);


motor=0;


P1=0X00;


P3=0X00;


P0=0x00;


}


while(s3_jiting==0);


}


float v_PIDCalc(float vi_Ref,float vi_SpeedBack)


{


register float error1,d_error,dd_error;


error1=vi_Ref-vi_SpeedBack; //偏差的计算


d_error=error1-vi_PreError; //误差的偏差


dd_error=d_error-vi_PreDerror; //误差变化率


vi_PreError=error1; //存储当前偏差


vi_PreDerror=d_error;


bianhuasu=(v_kp*d_error+v_ki*vi_PreError+v_kd*dd_error);


return (bianhuasu);


}


void v_Display()


{


uint su;


su=(int)(reallyspeed*10); //乘以10之后强制转化成整型


speed[3]=su/1000; //百位


speed[2]=(su00)/100; //十位


speed[1]=(su0)/10; //个位


speed[0]=su; //小数点后一位


wei1=0; //第一位打开


P0=table[speed[3]];


delay(5);


wei1=1; //第一位关闭


wei2=0;


P0=table[speed[2]];


delay(5);


wei2=1;


wei3=0;


P0=table[speed[1]];


xiaoshudian=1;


delay(5);


wei3=1;


wei4=0;


P0=table[speed[0]];


delay(5);


wei4=1;


}


void BEEP()


{


if((reallyspeed)>=vi_Ref+5||(reallyspeed


{


beep=~beep;


delay(4);


}


}


void main()


{


time_init();


motor=0;


while(1)


{


v_Display();


BEEP();


}


if(s3_jiting==0) //对按键3进行扫描,增强急停效果


{


delay(20);


motor=0;


P1=0X00;


P3=0X00;


P0=0x00;


}


while(s3_jiting==0);


}


void timer0() interrupt 1


{


}


void timer1() interrupt 3


{


TH1 = (65536-100)/256; //1ms定时


TL1 = (65536-100)%6;


sample_time++;


if(sample_time==5000) //采样时间0.1ms*5000=0.5s


{


TR0=0; //关闭定时器0


sample_time=0;


pulse_count=TH0*255+TL0; //保存当前脉冲数


keyscan(); //扫描按键


reallyspeed=pulse_count/(4*0.6); //计算速度


pwm=pwm+v_PIDCalc(vi_Ref,reallyspeed);


if(pwm


if(pwm>100)pwm=100;


TH0=TL0=0;


TR0=1; //开启定时器0


}


num++;


if(num==pwm) //此处的num值,就是占空比


{


motor=0;


}


if(num==100) //100相当于占空比调节的精度


{


num=0;


motor=1;


}


}



Ⅳ 如何利用单片机设定直流电机转速

最好的办法是在电动机轴上安装测转速的传感器,单片机检测转速,通过软件与设定值比较,控制
PWM电路
,控制电动机的转速。

Ⅳ 单片机如何控制电机转速

利用单片机的定时器TIMER_A(TA)中断产生脉冲信号,通过在响应的中断程序中实现步进电机步数和圈数的准确计数,通过PWM实现转速控制。

可以利用P10端口的中断关闭TA中断程序,并推入堆栈,停止电机;P11中断则开启TA中断,堆栈推入程序计器(PC),开启电机。

P31端口输出高电平由PMM8713的U/D端口控制电机的转向;P3.0~P37端口接8279的8个数据接口。

单片机扫描到矩阵键盘有键按下时,利用P2端口的中断设置TA,控制启停、调速和转向等,同时单片机反馈给8279控制LED管显示转速和转向。

(5)基于单片机的直流电机转速控制扩展阅读

1、单片机所接收到控制命令暂存在RXBUFFER中,与存储在片内Flash的中断程序的入口地址相比较,相同就进入中断,实现步进电机的控制。

2、当P1.0中为高电平时,其内部三极管导通,使电机转动。当P1.0为低电平时,内部三极管截止,电路断开,电机停止转动。所以在程序中可以利用P1.0口输出PWM波来控制电机的转速。

Ⅵ 基于单片机的PWM控制直流电机调速

如果是pwm控制的话,d/a部分可以不要,单片机直接控制驱动电路就行了,可用光耦隔离。不过你的直流电机和单片机共用5v电源的话,电机端电容要大一点。调速要求不高的话用8位单片机就行了。
单片机的编译环境用什么取决于你用什么单片机,调速要求不高的话,用51单片机,编程可以用keil。驱动电路硬件自己做的话可用protel
,orcad,powerpcb等绘制电路板。
框图推荐用microsoft
office
visio画,比较简单。

Ⅶ 单片机如何控制直流电机的速度

基于模糊PID的直流力矩电机转速控制。

在分析模糊控制和PID控制结合方式的基础上,设计一个二维模糊PID控制算法,该算法根据误差信号是否达到阈值来决定何时在模糊控制与PID控制之间切换.采用编码器、80196KC单片机、16位D/A转换器和直流力矩电并结合上述控制算法构成直流力矩电机的模糊PID稳速控制系统.通过对标准PID和模糊PID实测数据分析比较说明,模糊PID控制可以达到无超调输出,其调节时间小于标准PID控制的调节时间,稳态误差小于万分之四.

Ⅷ 51单片机如何控制直流电机转速

电机转速和电压成正比。利用PWM可以输出不同的平均电压,达到调整转速的目的。
你控制的只有PWM的占空比。
时间、脉冲周期什么的,一开始就定了。

Ⅸ 基于单片机的pwm小功率直流电机调速

直流调速器就是调节直流电动机速度的设备,上端和交流电源连接,下端和直流电动机连接,直流调速器将交流电转化成两路输出直流电源,一路输入给直流电机砺磁(定子),一路输入给直流电机电枢(转子),直流调速器通过控制电枢直流电压来调节直流电动机转速。同时直流电动机给调速器一个反馈电流,调速器根据反馈电流来判断直流电机的转速情况,必要时修正电枢电压输出,以此来再次调节电机的转速。

直流电机的调速方案一般有下列3种方式:

1、改变电枢电压;
2、改变激磁绕组电压;
3、改变电枢回路电阻。

使用单片机来控制直流电机的变速,一般采用调节电枢电压的方式,通过单片机控制PWM1,PWM2,产生可变的脉冲,这样电机上的电压也为宽度可变的脉冲电压。根据公式

U=aVCC

其中:U为电枢电压;a为脉冲的占空比(0<a<1);VCC直流电压源,这里为5V。

电动机的电枢电压受单片机输出脉冲控制,实现了利用脉冲宽度调制技术(PWM)进行直流电机的变速。

因为在H桥电路中,只有PWM1与PWM2电平互为相反时电机才能驱动,也就是PWM1与PWM2同为高电平或同为低电平时,都不能工作,所以上图中的实际脉冲宽度为B,

我们把PWM波的周期定为1ms,占空比分100级可调(每级级差为10%),这样定时器T0每0.01ms产生一次定时中断,每100次后进入下一个PWM波的周期。上图中,占空比是60%,即输出脉冲的为0.6ms,断开脉冲为0.4ms,这样电枢电压为5*60%=3V。

我们讨论的是可以正转反转的,如果只按一个方向转,我们就只要把PWM1置为高电平或低电平,只改变另一个PWM2电平的脉冲变化即可,,如下图(Q4导通,Q3闭合,电机只能顺时针调整转动速度)

C语言代码:

#include<AT89X52.h>
#define uchar unsigned char
#define uint unsigned int

sbit K5=P1^4;
sbit K6=P1^5;
sbit PWM1=P1^0;
sbit PWM2=P1^1;
sbit FMQ=P3^6;

uchar ZKB1,ZKB2;

void delaynms(uint aa)
{
uchar bb;
while(aa--)
{
for(bb=0;bb<115;bb++) //1ms基准延时程序
{
;
}
}

}

void delay500us(void)
{
int j;
for(j=0;j<57;j++)
{
;
}
}

void beep(void)
{
uchar t;
for(t=0;t<100;t++)
{
delay500us();
FMQ=!FMQ; //产生脉冲
}
FMQ=1; //关闭蜂鸣器
delaynms(300);
}

void main(void)
{
TR0=0; //关闭定时器0
TMOD=0x01; //定时器0,工作方式1
TH0=(65526-100)/256;
TL0=(65526-100)%256; //100us即0.01ms中断一次
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器T0
ZKB1=50; //占空比初值设定
ZKB2=50; //占空比初值设定
while(1)
{
if(!K5)
{
delaynms(15); //消抖
if(!K5) //确定按键按下
{
beep();
ZKB1++; //增加ZKB1
ZKB2=100-ZKB1; //相应的ZKB2就减少
}
}
if(!K6)
{
delaynms(15); //消抖
if(!K6) //确定按键按下
{
beep();
ZKB1--; //减少ZKB1
ZKB2=100-ZKB1; //相应的ZKB2增加
}
}
if(ZKB1>99)
ZKB1=1;
if(ZKB1<1)
ZKB1=99;

}
}

void time0(void) interrupt 1
{
static uchar N=0;
TH0=(65526-100)/256;
TL0=(65526-100)%256;
N++;
if(N>100)
N=0;
if(N<=ZKB1)
PWM1=0;
else
PWM1=1;
if(N<=ZKB2)
PWM2=0;
else
PWM2=1;

}

//显现:电机转速到最高后,也就是N为1或99时,再按一下,就变到99或1,
//电机反方向旋转以最高速度

Ⅹ 怎样用单片机控制直流电动机

1,简单的开关控制,用单片机引脚输出高低电平,控制MOS管驱动电路。
2,正反转控制,需要两个单片机引脚,一个控制正反转,一个控制启动与否。
3,需要控制速度,(1)电压控制,(2)PWM(脉宽)控制。
4,需要控制转角,首先能够控制速度,然后增加一个编码器,单片机中加入PID控制,用以精确控制。
以上大概就是直流电机能够控制的东西。

阅读全文

与基于单片机的直流电机转速控制相关的资料

热点内容
我的世界怎么进ec服务器地址大全 浏览:64
单片机和嵌入式软件开发区别 浏览:338
为什么扫一扫提示服务器繁忙 浏览:388
慎小嶷十天突破雅思口语pdf 浏览:605
解压数据丢失 浏览:49
查一下电脑上文件夹锁 浏览:296
加密聊天消息密钥输入什么 浏览:543
32位windows编译器 浏览:964
ipad邮件无法连接发件服务器地址 浏览:61
php接收websocket 浏览:564
碧蓝航线如何查账号服务器 浏览:835
msx命令 浏览:750
怎么购买app内购 浏览:490
vivo手机怎么把安卓系统提示关闭 浏览:964
汽油分配控制单片机 浏览:579
python字典最大值最小值求和 浏览:281
php7pdo扩展 浏览:941
粉笔app如何看行测 浏览:817
如何举报不正当app 浏览:255
智能家居算法组 浏览:56