历史上的今天
今天是:2024年11月23日(星期六)
2019年11月23日 | 51单片机PID+PWM直流电机转速闭环控制源码(12864液晶显示)
2019-11-23 来源:51he
制作完成的pid直流电机转速控制系统实物图:
51单片机源程序如下:
#include #include "intrins.h" #include #define uchar unsigned char #define uint unsigned int #define GPIO_KEY P2 sbit PWM=P1^4; sbit P10=P1^0; sbit P12=P1^2; uchar speed1[4]={"0000"};//设定转速 uchar speed2[3]={"000"};//占空比 uchar speed[]={"0000"};//当前转速 uchar KeyValue=0; uint AA,count=0,flag; float pid_p=0.003,pid_i=0.003,pid_d=0.002; //PID三个参数 初值 uint SpeedSet=3000,CurrentSpeed;//设定转速 当前转速 unsigned char pid_val_mid;//pid_val_mid脉冲宽度 unsigned int lastError=0; long int sumError=0;//sum偏差和 void delay1(unsigned int i) { unsigned int j; for(;i>0;i--) for(j=0;j<333;j++) {;} } /********************* 键盘扫描*************/ void KeyDown(void) { GPIO_KEY=0x0f; delay1(10); if(GPIO_KEY!=0x0f) { delay1(10); if(GPIO_KEY!=0x0f) { //测试列 GPIO_KEY=0X0F; delay1(10); switch(GPIO_KEY) { case(0X07): KeyValue=0;break; case(0X0b): KeyValue=1;break; case(0X0d): KeyValue=2;break; case(0X0e): KeyValue=3;break; } //测试行 GPIO_KEY=0XF0; delay1(10); switch(GPIO_KEY) { case(0X70): KeyValue=KeyValue;break; case(0Xb0): KeyValue=KeyValue+4;break; case(0Xd0): KeyValue=KeyValue+8;break; case(0Xe0): KeyValue=KeyValue+12;break; } } } } void timer() { TMOD=0x11;//定时器0工作方式1.16位,定时器1工作方式1,16位定时; TH0=0x4b;//50ms初值 TL0=0xfe; TH1=0xfc;//1msPWM控制 TL1=0x66; TR1=1; //启动定时器1 ET1=1; //定时器1中断使能 IT0=1;//外部中断下降沿触发 TR0=1; //定时器启动标志 ET0=1; //定时器中断使能 EX0=1; //外部中断使能 EA=1; //全局中断 } /***********************lcd显示*************/ void display() { speed[0]=CurrentSpeed/1000+0x30; //当前转速 speed[1]=CurrentSpeed/100%10+0x30; speed[2]=CurrentSpeed/10%10+0x30; speed[3]=CurrentSpeed%10+0x30; speed1[0]=SpeedSet/1000+0x30;//设定转速 speed1[1]=SpeedSet/100%10+0x30; speed1[2]=SpeedSet/10%10+0x30; speed1[3]=SpeedSet%10+0x30; speed2[0]=pid_val_mid/100+0x30; speed2[1]=pid_val_mid/10%10+0x30;//占空比 speed2[2]=pid_val_mid%10+0x30; DispHanzi(0,0,5,"当前转速:"); DispZimu(0,5,4,speed); DispHanzi(1,0,5,"设定转速:"); DispZimu(1,5,4,speed1); DispHanzi(3,0,4,"占空比:");//占空比 DispZimu(3,4,3,speed2); DispHanzi(3,6,1,"%");//占空比 } /************************电机控制*************/ void keyKZ() { if(KeyValue==4)//正转 { P10=1; P12=0; } if(KeyValue==5)//反转 { P10=0; P12=1; } if(KeyValue==6)//停车 { P10=0; P12=0; } if(KeyValue==12)//设定速度加50 SpeedSet+=50; if(KeyValue==13)//设定速度减50 SpeedSet-=50; if(KeyValue==14)//设定速度加1 SpeedSet+=1; if(KeyValue==15)//设定速度减1 SpeedSet-=1;
上一篇:基于51单片机的等精度频率计设计
下一篇:单片机全自动洗衣机程序
史海拾趣
|
占用大侠一点时间,提个问题::请路过的,知道的高抬贵手,感谢不尽。我使用的是 西门子的MC39I 模块做通信终端 问题如下,我做的GPRS DTU 在拨号成功以后:APN 与我发送的数据如下,一下用 A -> M 代表apn向dut 发送数据;M -> A代表DTU向APN发送 ...… 查看全部问答> |
|
使用VS2005编译TCPMP,安装了CE6.0的SDK,编译成功,但运行时总是出现错误:弹出对话框,crash.txt。 调试时发现,错误好像与common.dll在关。但本人就是无法修改(即不能发现出错的原因)使TCPMP在CE6.0上正常运行。 请有经验的朋友说说,这个错误 ...… 查看全部问答> |
|
#include sbit light=P1^0; void delay(); void main() { while(1) { light=1;//灭灯 &nbs ...… 查看全部问答> |
|
大伙,请问开关打上瞬间产生的峰值电压如何滤除,我的情况是这样的:380VAC的三相电经过一个3P(跳菲开关)出来,通过电感和电容的滤波给三相整流桥,出来的电压再经滤波给设备供电。出现的情况是:跳菲开关打上瞬间,有时会把三相整 ...… 查看全部问答> |
|
我是光盘里面拷出来的程序GPIO的,编译可以通过但是在load的时候提示 这个是我的cmd文件: Data verfication failed at address 0x100h,我觉得在程序和数据空间分配上没有什么问题,但是就是Load不了,请工程师帮我解答一下 MEMORY { & ...… 查看全部问答> |




