历史上的今天
今天是:2024年12月19日(星期四)
2020年12月19日 | 51单片机PID控制垂直风力摆设置角度
2020-12-19 来源:51hei
#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); } }
史海拾趣
|
美国国家半导体公司 (National Semiconductor)宣布推出一套功能齐备的网上设计工具 WEBENCH Active Filter Designer (有源滤波器设计套件) ,确保系统设计工程师可以在最短时间内成功开发一款适用于数据搜集及信号调节的新一代滤波器。这是一套全新 ...… 查看全部问答> |
|
2006年 四川省大学生电子设计竞赛试题-简易数字频率计(内江师院) 本帖最后由 paulhyde 于 2014-9-15 09:46 编辑 电子设计竞赛试题简易数字频率计 一、电子设计竞赛设计任务: 设计并制作一台数字显示的简易频率计。 二、电子设计竞赛设计要求: 1、基本要求: (1)频率测量 测量范围:1HZ~1MHZ,信 ...… 查看全部问答> |
|
0.引 言 目前,我国对于大部分供电电力设备的监控和管理上基本还停留在人工巡查这种比较原始的管理方式下(例如铁路道口的信号电源),不但管理效率低下,而且供电质量和水平都得不到有效的保证。本文以实时操作系统small RTOS51为基础,主要探 ...… 查看全部问答> |
|
本人最近正在用VeriLog HDL语言编写一个异步FIFO,我采用的是二进制转换为格雷码来判空判满。但能力有限,两天下来都没有结果,希望得到高人指点。… 查看全部问答> |
|
#include \"includes.h\" #define TASK_STK_SIZE 512 //任务堆栈长度 #define N_MESSAGES 1024 //任务堆栈长度 OS_STK StartTaskStk[TASK_STK_SIZE]; //定义任务堆栈区 OS_STK MyTaskStk[TASK_STK_SIZE]; //定义任务堆栈区 INT16S key; //用于退出 ...… 查看全部问答> |




