51单片机PID+PWM直流电机转速闭环控制源码(12864液晶显示)

发布者:csw520最新更新时间:2019-11-23 来源: 51he关键字:51单片机  PID  PWM  直流电机  转速闭环控制  12864液晶显示 手机看文章 扫描二维码
随时随地手机看文章

设计内容及要求

内容包括:

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;

[1] [2]
关键字:51单片机  PID  PWM  直流电机  转速闭环控制  12864液晶显示 引用地址:51单片机PID+PWM直流电机转速闭环控制源码(12864液晶显示)

上一篇:基于51单片机的等精度频率计设计
下一篇:单片机全自动洗衣机程序

推荐阅读最新更新时间:2024-11-12 20:26

嵌入式学习⑩——STM的PWM和DAC
一、STM32F103输出PWM 本部分参考自博客:(stm32f103学习总结)—stm32 PMW输出实验 PWM 是 Pulse Width Modulation 的缩写,中文意思就是脉冲宽度调制,简称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,其控制简单、灵活和动态响应好等优点而成为电力电子技术最广泛应用的控制方式。 其实我们也可以这样理解,PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。 1.STM32F1 PWM介绍 STM32F1除了基本定时器TIM6和TIM7,其他定时器都可以产生PWM输出
[单片机]
嵌入式学习⑩——STM的<font color='red'>PWM</font>和DAC
8051单片机串口复杂命令接收与解析
下面程序是为了实现二自由度自动进样检测器的控制而编写的. 在程序执行过程中, 我发现, 在发送Start.E再发送Stop.E后, 串口助手接收缓存区并未显示一连串 00 : 这说明在输入Start.E后, 虽然又收到Stop.E时执行了 en = 0 这个表达式, 但是回到第一层中断处理程序后, 这里的en还是 1 (并未变为我们希望的 0 ). 这说明, 以串口中断实现对二自由度自动进样检测仪的控制, 还是有一定难度的. 接下来我将致力于解决这一难题. #include STC89C5xRC.H char buf ;//存放串口传来的数据 int i = 0; int en; void UART_INT()
[单片机]
基于51单片机+DHT11温湿度+LCD1602显示
DHT11温湿度相关介绍 DHT11产品概述 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传 感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高 的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测 温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快 响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的 湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内 部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集 成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使 其成为各类应用甚至最为
[单片机]
基于<font color='red'>51单片机</font>+DHT11温湿度+LCD1602显示
keil5安装及51单片机入门程序实例
1. keil5的安装 之前我在找的时候,一直以为官网不是很方便下载,在其他地方找,这过程很玛法,今天试了一下官网发现非常方便. 进入官网,点击Downloads 点击C51,以为我们是写51的单片机嘛,当然也可以下载其他的。 然后填写一下信息,非常方便的,而且很快,然后submit就ok了 在安装好了之后,需要我们破解,这里我们需要下载一个软件,在网上可以很方便地找到,这个很方便,就不啰嗦了。 现在打开keli5,点击project,创建新项目 7. 然后就是选择文件夹了,之后找到AT89C51即可 8. 然后点击添加文件 9. 之后就是选择文件类型,和定义文件名了 完了之后就可以开始写程序啦。
[单片机]
keil5安装及<font color='red'>51单片机</font>入门程序实例
51单片机 主循环和中断共享全局变量的冲突
现象:工作中遇到一个大坑,STC11F32的运行灯闪的不均匀,大多数是500ms低电平和500ms高电平,但偶尔会有40ms左右的高、低电平出现,对,就这么简单的一个程序,奇哉怪哉! //定义全局变量:ms计数器 unsigned int cnt_ms; //定义全局变量:ms计数器备份 unsigned int cnt_ms_bk; //定义LED对应的IO口 sbit LED = P3 ^ 3; //主循环读访问 int main(void) { ...... if ((cnt_ms - cnt_ms_bk) 500) { led = ~led; cnt_ms_bk = cnt_ms; } ......
[单片机]
三相无刷直流电机是什么
  三相无刷直流电机   无刷直流电机由电动机主体和驱动器组成,是一种典型的机电一体化产品。 无刷电机是指无电刷和换向器(或集电环)的电机,又称无换向器电机。早在十九纪诞生电机的时候,产生的实用性电机就是无刷形式,即交流鼠笼式异步电动机,这种电动机得到了广泛的应用。但是,异步电动机有许多无法克服的缺陷,以致电机技术发展缓慢。上世纪中叶诞生了晶体管,因而采用晶体管换向电路代替电刷与换向器的直流无刷电机就应运而生了。这种新型无刷电机称为电子换向式直流电机,它克服了第一代无刷电机的缺陷。   无刷直流电动机是采用半导体开关器件来实现电子换向的,即用电子开关器件代替传统的接触式换向器和电刷。它具有可靠性高、无换向火花、机械噪声低等优点
[嵌入式]
蓝牙定时开关APP软件(附51单片机参考程序)
APP发送字符“1”至“7”数字。比如第一组定时发送的是字符“1”。第二组定时发送字符“2”.....一共7组。可用串口助手测试,电脑与蓝牙模块通信连接,如图1.所示。 单片机源程序如下: #include reg52.h #include intrins.h #define uchar unsigned char #define uint unsigned int uchar tmp; uint c=0; sbit led1=P1^0; //指示灯0 sbit led2=P1^1; //指示灯1 sbit led3=P1^2; //指示灯3 sbit le
[单片机]
蓝牙定时开关APP软件(附<font color='red'>51单片机</font>参考程序)
关于51单片机IO引脚的驱动能力与上拉电阻
单片机的引脚,可以用程序来控制,输出高、低电平,这些可算是单片机的输出电压。 但是,程序控制不了单片机的输出电流。 单片机的输出电流,很大程度上是取决于引脚上的外接器件。 单片机输出低电平时,将允许外部器件,向单片机引脚内灌入电流,这个电流,称为“灌电流”,外部电路称为“灌电流负载”; 单片机输出高电平时,则允许外部器件,从单片机的引脚,拉出电流,这个电流,称为“拉电流”,外部电路称为“拉电流负载”。 这些电流一般是多少?最大限度是多少? 这就是常见的单片机输出驱动能力的问题。 早期的 51 系列单片机的带负载能力,是很小的,仅仅用“能带动多少个 TTL 输入端”来说明的。 P1、P2 和 P3口,每个引脚可以都带动
[单片机]
关于<font color='red'>51单片机</font>IO引脚的驱动能力与上拉电阻
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved