#include #include "i2c.h" #include "delay.h" #include "display.h" #include "math.h" #define uchar unsigned char #define uint unsigned int #define AddWr 0x90 //写数据地址 #define AddRd 0x91 //读数据地址 void timer0_init(); //定时器0初始化 void motor_run(); void control(); uchar time; uint motor_pwm; double count=0; //定义占空比,并初始占空比为26% sbit PWM=P2^3; sbit Motor_CW=P2^4; sbit Motor_CCW=P2^5; float angleset=50; float angel; uint nowerror; long sumerror; uint lasterror; float output; float kp=0.56,ki=0.008,kd=1; extern bit ack; bit flag; //bit WriteDAC(unsigned char dat); /*------------------------------------------------ 主程序 ------------------------------------------------*/ uchar ReadADC(uchar Chl) { uchar val; Start_I2c(); SendByte(AddWr); if(ack==0)return (0); SendByte(Chl); if(ack==0)return (0); Start_I2c(); SendByte(AddRd); if(ack==0)return (0); val=RcvByte(); NoAck_I2c(); Stop_I2c(); return(val); } void motor_run(uint pwm) { if(time PWM=1; }else { PWM=0; } if(time>100) { time=0; flag=1; } } /****************************pid*****************************/ void timer0_init() { TMOD=0x01; //定时器0工作于方式1 TH0=(65536-100)/256; TL0=(65536-100)%256; TR0=1; ET0=1; EA=1; } /**************定时0中断处理******************/ void timer0_int() interrupt 1 { TR0=0; //设置定时器初值期间,关闭定时器 TH0=(65536-100)/256; TL0=(65536-100)%256; TR0=1; time++; motor_run(motor_pwm); } uint XIANFU_Pwm(uint pwm) { if ( pwm <0) pwm = 0; if (pwm>=100) pwm= 100; return pwm; } float PID_Control(float angleset,float angel) { angel=ReadADC(0x40); nowerror=angleset-angel;//当前误差 sumerror+=nowerror; //误差求和 if(sumerror>2500) sumerror=2500;//限幅 output = kp*nowerror+ki*sumerror+kd*(lasterror-nowerror); lasterror=nowerror; return output;//增量输出 } void control() { motor_pwm=(uint) PID_Control(angleset,angel); motor_pwm= XIANFU_Pwm(motor_pwm); //motor_run(motor_pwm); } main() { float angleAD; Motor_CW=0; //电机正反转 Motor_CCW=1; timer0_init(); while(1) { if(flag==1) { flag=0; control(); } angleAD = ReadADC(0x40); //绝对角度数字值AD值 display(angleAD); //WriteDAC(angleAD); } }
上一篇:自己做的单片机音乐盒,外加LED做数码管显示数字
下一篇:基于RS-485总线的单片机温控系统程序
推荐阅读最新更新时间:2024-11-05 13:39
设计资源 培训 开发板 精华推荐
- 使用 Analog Devices 的 LT1086IT 的参考设计
- esp8266-WROOM-02D优化版本
- RT9164C 1A 低压差正固定稳压器的典型应用
- AM3G-2415DH30Z ±15V 3 瓦 DC-DC 转换器的典型应用
- LTC3622HMSE-2 5V/3.3V Vout、突发模式操作、同相开关同步降压稳压器的典型应用电路
- LTC3789EUFD 演示板、高效紧凑型降压-升压转换器
- 基于安信可ESP-S3-12K模组的ESP32S3开发板
- LTC1650IS 低毛刺 16 位电压输出 DAC 的典型应用电路
- arduino-nano 官方 完整版
- 【训练营_进阶班】基于ESP8266的智慧生活套件