历史上的今天
返回首页

历史上的今天

今天是:2024年11月23日(星期六)

2019年11月23日 | 51单片机PID+PWM直流电机转速闭环控制源码(12864液晶显示)

2019-11-23 来源:51he

设计内容及要求

内容包括:

1.        查找文献资料,学习直流电机控制的工作原理;

2.        转速控制系统方案设计

3.        硬件电路设计,绘制电路原理图和PCB图;

4.        设计软件,并调试

5.        综合调试,测试、分析误差原因

6.        撰写设计报告

要求:

1.矩阵键盘设定并显示转速,实时显示实际转速

2.按键控制电机起停、正反转

3.PWM转速闭环控制。
4.用lcd12864液晶屏显示相关内容

设计

参数

1.转速调节范围:1500转/分--3000转/分

2.测速误差<10%



制作完成的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;

推荐阅读

史海拾趣

Digilent公司的发展小趣事

作为电子行业的领军企业之一,DIALIGHT始终将技术创新作为公司发展的核心驱动力。公司拥有一支高素质的研发团队和先进的研发设施,不断推出具有创新性和竞争力的LED产品。同时,DIALIGHT还积极与高校、科研机构等合作,共同推动LED照明技术的进步和应用。

Eaton公司的发展小趣事

除了能源管理领域外,伊顿公司还在商用车领域取得了显著成就。自1985年首次将技术引进中国以来,伊顿的变速器产品已经进入中国市场30多年。通过与国内各个商用车生产企业的紧密合作,伊顿成功地将其先进的变速器技术应用于各种商用车型中,提高了车辆的燃油经济性和驾驶舒适性。特别是在物流行业,伊顿的变速器产品帮助车队降低了油耗成本,提高了运营效率。

DAYLIGHT公司的发展小趣事

近年来,随着数字化技术的快速发展,DAYLIGHT公司也积极拥抱数字化转型。公司加强了与互联网、大数据、人工智能等技术的融合,推出了一系列智能化、数字化的电子产品和服务。这些新产品和服务的推出不仅提升了DAYLIGHT的市场竞争力,也为其未来的发展奠定了坚实的基础。同时,DAYLIGHT还积极关注未来电子行业的发展趋势和技术创新,为公司的长期发展制定了明确的战略规划。

请注意,这些故事是基于假设和一般行业趋势虚构的,并不代表DAYLIGHT公司的实际发展历程。如果您需要更具体的信息,建议直接联系DAYLIGHT公司或查阅相关的行业资料。

Amidon Associates Inc公司的发展小趣事

随着公司规模的扩大和市场份额的增加,DAYLIGHT开始将目光投向国际市场。公司通过与国际知名电子企业的合作,成功将其产品打入国际市场,并在多个国家和地区建立了销售渠道。同时,DAYLIGHT还积极参与国际电子展和技术交流会议,不断提升其在国际市场上的知名度和影响力。

AUSTIN公司的发展小趣事

在合并与合作的背景下,奥斯汀汽车开始注重产品创新和多样化。公司不断推出新的车型,以满足不同消费者的需求。例如,奥斯汀A40和A50等车型在市场上取得了不错的销量。同时,奥斯汀汽车还注重技术研发和创新,不断提升产品的性能和品质。

Changzhou Galaxy Century Microelectronics Co.,Ltd公司的发展小趣事

为了进一步加速企业的发展,银河微电决定走上上市之路。经过精心筹备和严格审核,公司终于在2021年成功在上交所上市。上市不仅为公司带来了大量的资金支持,还提高了公司的知名度和品牌影响力。借助上市融资的优势,银河微电加大了对研发、生产、销售等各个环节的投入,企业发展步入快车道。

问答坊 | AI 解惑

TLC1549

本帖最后由 paulhyde 于 2014-9-15 09:27 编辑 十位的串行AD  …

查看全部问答>

40个让你震撼的高速摄影照片

纯粹娱乐 是不是觉得生活更美好了呢?…

查看全部问答>

I2C

看有兄弟想要I2C,这里附上我找到的几个吧…

查看全部问答>

1114积分留恋!!!!

今天终于1114分了,来之不易啊,和NXP LPC1114还很有缘啊!留恋一下:   …

查看全部问答>

关于GPRS PAP 协议握手失败的问题

占用大侠一点时间,提个问题::请路过的,知道的高抬贵手,感谢不尽。我使用的是 西门子的MC39I 模块做通信终端 问题如下,我做的GPRS DTU 在拨号成功以后:APN 与我发送的数据如下,一下用 A -> M 代表apn向dut 发送数据;M -> A代表DTU向APN发送 ...…

查看全部问答>

TCPMP 0.72RC1 for CE6.0的错误

使用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(跳菲开关)出来,通过电感和电容的滤波给三相整流桥,出来的电压再经滤波给设备供电。出现的情况是:跳菲开关打上瞬间,有时会把三相整 ...…

查看全部问答>

2407板子load的时候出现问题了

我是光盘里面拷出来的程序GPIO的,编译可以通过但是在load的时候提示 这个是我的cmd文件: Data verfication failed at address 0x100h,我觉得在程序和数据空间分配上没有什么问题,但是就是Load不了,请工程师帮我解答一下 MEMORY {  & ...…

查看全部问答>