完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
#include
#include #define T2RUN temppage=SFRPAGE;SFRPAGE=0x00;TR2=1;SFRPAGE=temppage #define T4RUN temppage=SFRPAGE;SFRPAGE=0x02;TR4=1;SFRPAGE=temppage #define T4STOP temppage=SFRPAGE;SFRPAGE=0x02;TR4=0;SFRPAGE=temppage #define T2STOP temppage=SFRPAGE;SFRPAGE=0x00;TR2=0;SFRPAGE=temppage typedef unsigned int uint; typedef unsigned long ulong; typedef unsigned char uchar; float y; uchar temppage; uint Error,tempi,verror; typedef struct PID{ uint setpoint; /*设定值*/ uint proportion; /*比例系数*/ uint integral; /*积分系数*/ uint derivative; /*微分系数 */ uint lasterror; /*前一拍误差*/ uint preerror; /*前两拍误差*/ }PID; PID vPID; union stu{ uint value; uchar num[2]; }laser; /* void PIDInit(PID *pp) { memset (pp,0,sizeof(pp)); }*/ void T2_ini(){ temppage=SFRPAGE; SFRPAGE=0x00; TMR2CN=0x02; //T2工作在计数状态 自动重载装置 TMR2CF=0x00; TMR2H=0x00; TMR2L=0x00; RCAP2L=0x00; RCAP2H=0x00; SFRPAGE=temppage; } void T4_ini(){ temppage=SFRPAGE; SFRPAGE=0x02; TMR4H=(65536-2000)/256; TMR4L=(65536-2000)%256; TMR4CN=0x00; TMR4CF=0x02; //采用系统时钟12分频 RCAP4L=0x3F; RCAP4H=0xB0; //定时10ms SFRPAGE=temppage; EIE2|=0x04; //开启中断 SFRPAGE=temppage; } void pca0ini(){ SFRPAGE=0x00; //CEX0 为8位PWM输出模式,频率为 PCA0CPM0=0x42; } void PWM0_set(uchar low){ SFRPAGE=0x00; PCA0CPH0=low; //设置占空比 } void pcaini(){ SFRPAGE=0x00; PCA0MD=0x00; //PCA采用系统时钟12分频,禁止PCA中断 PCA0CN=0x40; //启动PCA计数 } void config(){ WDTCN=0x07; WDTCN=0xde; WDTCN=0xad; SFRPAGE=0x0f; //交叉开关配置,TX0=P0.0,RX0=P0.1,CEX0=P0.2,CEX1=P0.3 CEX2=P0.4 CEX3=P0.4 CEX4=P1.0 CEX5=P1.1 XBR0=0x34; XBR1=0x20; // T2=P1.3 XBR2=0x42; //跳过P0.5,P0.6 ,P0.7 XBR3=0x00; SFRPAGE=0x0f; P0MDOUT=0xff; //P0 P1 位推挽输出 P1MDOUT=0xff; P2MDOUT=0xff; P1MDIN=0xff; //采用内部晶振1分频 SFRPAGE=0x0f; CLKSEL=0x00; OSCXCN=0x00; OSCICN=0x83; } /*PID算法函数,返回误差增量*/ uint PIDcal(PID *pp,char thisError){ int pError,dError,iError; int templ; pError=thisError-pp->lasterror; iError=thisError; dError=thisError-2*(pp->lasterror)+pp->preerror; templ=(pp->proportion)*pError+(pp->integral)*iError+(pp->derivative)*dError; /*增量计算*/ pp->preerror=pp->lasterror; /*存放误差用于下次运算*/ pp->lasterror=thisError; return ((uint)(templ>>4)); } /* void delay1ms(uint time){ //延时1 ms uint i; uint j; for(i=0;i for(j=0;j<300;j++); }*/ void main(){ // PIDInit(&vPID); vPID.preerror=0; vPID.lasterror=0; vPID.proportion=2.5; /*设置PID比例系数为*/ vPID.integral=2.5; /*设定PID积分系数 为*/ vPID.derivative=0.001; /*设定PID微分系数为*/ vPID.setpoint=30; /*根据实际情况设定*/ config(); pcaini(); pca0ini(); T4_ini(); T2_ini(); EA=1; T2RUN; T4RUN; while(1){ } } void T4_rupt() interrupt 16 { xdata uchar lowset; /*误差增量*/ TF4=0; T2STOP; temppage=SFRPAGE; SFRPAGE=0x00; y=(TMR2H*256+TMR2L)*6; TMR2H=0x00; TMR2L=0x00; SFRPAGE=temppage; verror=(int)y; /*得到T4的计数值 */ Error=(vPID.setpoint)-verror; /*得到误差值*/ tempi=PIDcal(&vPID,Error); /*调用PID算法函数 得到误差增量*/ laser.value+=tempi; if(laser.value>=255) laser.value =255; else if(laser.value<=20) laser.value=22; else laser.value=laser.value; lowset=255-laser.value; PWM0_set(lowset); T2RUN; } 大神帮忙看看这是产生Pwm波的吗 是的话在哪里可以更改初始占空比 2607386161QQ联系 谢谢 紧急情况 是C8051F040单片机 |
|
相关推荐 |
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
304 浏览 0 评论
使用Keil建立完整的工程,并使用外部中断0触发数码管显示903
842 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-使用AHT20进行环境监测之AHT20传感器介绍
1131 浏览 0 评论
876 浏览 0 评论
914 浏览 1 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11837 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-1 18:22 , Processed in 0.439376 second(s), Total 38, Slave 32 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号