51单片机电机pid控制系统程序
21ic 2025-06-25

51单片机电机pid控制系统程序

本程序来源网上,小编进行了简单修改,还未验证。


/*************************

应用背景:直流电机的额定功率12V,额定转速3000rpm,光码盘12孔,

晶振为12MHz,定时/计数器T0检测转速,用定时器T1进行定时,

P1.0控制直流电机的正反转,用P1.1控制电机的转速.

************************/

#include

#include

#define uchar unsigned char

uchar timcount,PWMH,SpeedSet,SpeedDet;

uchar KP,KI,KD;

int e1,e2,e3,uk,duk;

sbit Dir = P1^0;

sbit PWM = P1^1;

//延时函数

void delay(uchar i)

{

uchar j;

for(;i>0;i--)

{

for(j=29;j;j--)

_nop_();

_nop_();

}

}

//延时函数,产生PWM波

void PWMout(uchar q)

{

PWM = 1;

delay(q);

PWM = 0;

delay(100-q);

}

void timer1() interrupt 3

{

TH1 = 0x3c; //(65536-50000)=15536= ox3c oxb0 即定时50ms

TL1 = 0xb0; //(65536-50000)=15536= ox3c oxb0 即定时50ms

if(--timcount==0)

{

timcount = 4;

TR0 = 0;

SpeedDet = TL0;

TL0 = 0;

TR0 = 1;

e1 = SpeedSet-SpeedDet;

duk = (KP*(e1-e2)+KI*e1+KD*(e1-2*e2+e3))/10; //误差的微分:(e1-2*e2+e3)=((e1-e2)-(e2-e3))/1

uk = uk+duk;

if(uk>100)

uk=100;

else if(uk<-100)

uk = -100;

if(uk<0)

{

PWMH = -uk;

Dir = 0;

}

else

{

PWMH =uk;

Dir = 1;

}

e3 = e2;

e2 = e1;

}

}

void main(void)

{

TMOD = 0x16; //T1工作于定时模式的方式一16位定时器;T0工作于计数模式的方式2八位自动重装模式。

TH0 = 0;//装载计数初始值为0

TL0 = 0;//装载计数初始值为0

TH1 = 0x3c;//(65536-50000)=15536= ox3c oxb0 即定时50ms

TL1 = 0xb0;//(65536-50000)=15536= ox3c oxb0 即定时50ms

timcount = 4; //

PWMH = 0; //PWM高电平时间初始为0

SpeedSet = 80;//设定期望值速度80

SpeedDet = 0; //速度偏移量

e1 = 0;//当前误差

e2 = 0;//上一次误差

e3 = 0;//上上次误差

KP =10; //比例系数

KI = 1;//积分系数

KD = 2;//微分系数

TR0 = 1; //打开定时器T0

TR1 = 1;//打开计数器T1

ET1 = 1;//允许中断T1

ET0 = 1;//允许中断T0

EA = 1;//打开总中断

while(1)

{

PWMout(PWMH); //电机运行速度

}

}

声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 【下载】电源设计工程师指南(共542页)


  • 相关技术文库
  • 单片机
  • 嵌入式
  • MCU
  • STM
  • 51单片机超声波测距程序详解

    51单片机超声波测距程序详解 超声波四通道测距:超声波测距实现分为三大块: 其一是12864带字库的液晶驱动程序: 代码如下: /////////////////12864驱动程序/////////////////////////// //1写数据 void WriteDat...

    5小时前
  • 51系列单片机的引脚图

    51系列单片机的引脚图 端子介绍 l P0.0~P0.7 P0口8位双向口线(在引脚的39~32号端子)。 l P1.0~P1.7 P1口8位双向口线(在引脚的1~8号端子)。 l P2.0~P2.7 P2口8位双向口线(在引脚的21~28号端子)。 l P3.0~P3.7 P2口8...

    5小时前
  • 51单片机串口通信需要加超时中断吗?

    接收数据时,超过一定时间就算出错. 这个超时的时间是单片机自己算出的吗?超时的时间是由编程序的人定的,他定多长就多长从一段程序开始 实现电脑向 单片机发送一些数据,单片机返回Iget +数据 #include #define u...

    5小时前
  • 51单片机指令集设计实例

    当你编写完一个程序后,通过软件调试,你可以看到程序的指令集,从指令集你就能知道单片机内部是如何工作的,比如数据存取的寄存器与地址,下面是电工之家找的一篇指令集,讲的蛮好的。 一、数据传送类指令(7种助...

    5小时前
  • 51单片机定时器工作原理及用法

    TMOD : 控制定时器的工作方式。8个bit,高四位 bit 控制 T1,、低四位 bit 控制 T0。因为定时器有4种工作方式;TMOD = 0x00(工作方式0),TMOD = 0x01(工作方式0),TMOD = 0x02(工作方式2),TMOD = 0x03(工作方式3)。...

    5小时前
  • 51单片机指令系统寻址方式

    指令给出参与运算的数据方式称为寻址方式。换句话说,寻址方式就是寻找确定参与操作的数的真正地址。 在MCS-51系列单片机的指令系统中寻址方式共有7种,立即寻址方式,mcs-51单片机的一种寻址方式,操作数就写在指...

    5小时前
  • 51单片机学习单片机之路总结

    学习单片机有一学期了,现在也由51转到STM32了。一直想对51的学习做一个总结。也希望对别人有一些启发。也给后学者提供一些建议。当然本文是我对自己学习过程的总结,若有不对的地方,还请高手指出。 我想,再看本...

    5小时前
  • 入手STM32单片机的知识点总结

    从STM32新建工程、编译下载程序出发,让新手由浅入深,尽享STM32标准库开发的乐趣

    前天
  • 单片机定时器之改良版:时间轮定时器

    前段时间把自己以前用的单片机定时器整理出来,我称之为简单定时器,这种简单定时器比较适合定时器使用量少的程序中,如果定时器数量要求多,精度要求高,效率就会有问题,为此,俺就实现了一个时间轮定时器,简单测...

    前天
  • 详聊单片机BootLoader的发展进化史

    Bootloader是一个用于引导嵌入式系统的软件程序,通常存储在芯片的非易失性存储器中,如闪存。Bootloader的主要功能是在系统上电后,负责初始化系统硬件并加载操作系统或应用程序到内存中执行。

    06-18
下载排行榜
更多
评测报告
更多
广告