历史上的今天
今天是:2025年02月23日(星期日)
2021年02月23日 | 51单片机电机pid控制系统程序
2021-02-23 来源:eefocus
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); //电机运行速度 } }
史海拾趣
|
汽车环境的宽工作电压要求、大瞬变电压以及大温度漂移等因素共同作用下,电子系统面临着严酷的条件,本文介绍如何在性能要求变得愈加苛刻的条件下,设计多个电源电压以满足汽车电子系统不同部分的要求。 ...… 查看全部问答> |
|
功率MOSFET具有导通电阻低、负载电流大的优点,因而非常适合用作开关电源(switch-mode power supplies,SMPS)的整流组件,不过,在选用MOSFET时有一些注意事项。 功率MOSFET和双极型晶体管不同,它的栅极电容比较大,在导通之前要 ...… 查看全部问答> |
|
如题. 做ARM开发,有时候会用到串并口,现在 的笔记本一般都没有,不知道大家有什么建议,我听朋友说,用转接口不太稳定.最好用台式机,不过我还是想换个带串并口的笔记本,大家有什么建议… 查看全部问答> |
|
eboot 分了 4个分区, 1个binfs 3个fatfs 3个fatfs在pc上都是别出来了, 现在遇到以下问题: 1). 我想隐藏其中2个fatfs分区, 因为 我要放 应用程序 用 所以需要隐藏起来 2). 现在分区的路径名是按默认的名字, 比如默认是 disk, 那么 后面几 ...… 查看全部问答> |
|
近期用atmega16 自身的ad测试陀螺仪,在测试的时候发现,当把ADC0接地时 LCD1602显示AD转换后的值为0096,接VCC=AVCC时 显示0993 这不对啊 应该是0和1023啊,这是程序 DDRA&=0xfe; PORTA&=0xfe; SF ...… 查看全部问答> |
|
【课后练习】LaunchPad课后练习九之模拟SPI驱动数码管 LaunchPad课后练习九之模拟SPI驱动数码管 1.采用共阳极的数码管 数码管实际上是由7个发光管组成8字形构成的,加上小数点就是8个。 什么是共阳极呢?就是他们的公共端接正极。扫描型的意思是,几位的数码管的段选都是 ...… 查看全部问答> |
|
1、寄存器 R13 在 ARM 指令中常用作堆栈指针 2、对于 R13 寄存器来说,它对应6个不同的物理寄存器,其中的一个是用户模式与系统模式共用,另外5个物理寄存器对应于其他5种不同的运行模式。采用以下的记号来区分不同的物理寄存器: R13_ 其中,mo ...… 查看全部问答> |




