51单片机PID控制垂直风力摆设置角度

发布者:xxoke624最新更新时间:2020-12-19 来源: 51hei关键字:51单片机  PID控制 手机看文章 扫描二维码
随时随地手机看文章

#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);

     

        }

}


关键字:51单片机  PID控制 引用地址:51单片机PID控制垂直风力摆设置角度

上一篇:自己做的单片机音乐盒,外加LED做数码管显示数字
下一篇:基于RS-485总线的单片机温控系统程序

推荐阅读最新更新时间:2024-11-05 13:39

基于RA8806控制器的LCD和51单片机接口技术
1 引言 由于点阵液晶显示具有高清晰度和高分辨率,可显示复杂文字和图形,耗电省等优点,在移动通讯、仪器仪表、电子设备等方面得到广泛应用。而触摸屏作为良好的人机接口一直应用于仪器仪表。触摸屏和点阵液晶显示模块的相互配合使用,使得人机界面更加完善美观。这里介绍的基于RA8806控制器的LCD就是内建触摸屏控制器的点阵液品显示模块。 2 RA8806控制器简介 RA8806是点矩阵液晶显示控制器,支持320x240、四灰阶、双图层文字及图形显示模式,内建中、日、英、欧文字型码,可将文字旋转90°、180°、270°显示。RA8806内建智能型触摸扫描控制器,支持4线电阻式触摸屏接口,带8x8的键盘扫描接口,可编程设置的脉宽调制
[单片机]
基于RA8806控制器的LCD和<font color='red'>51单片机</font>接口技术
51单片机复位电路原理介绍
复位电路的工作原理:在书本上有介绍,51单片机要复位只需要在第9引脚接个高电平持续2us就可以实现,那这个过程是如何实现的呢?在单片机系统中,系统上电启动的时候复位一次,当按键按下的时候系统再次复位,如果释放后再按下,系统还会复位。所以可以通过按键的断开和闭合在运行的系统中控制其复位。 1、开机的时候为什么复位? 在电路图中,电容的的大小是10uf,电阻的大小是10k。所以根据公式,可以算出电容充电到电源电压的0.7倍(单片机的电源是5V,所以充电到0.7倍即为3.5V),需要的时间是10K*10UF=0.1S。也就是说在电脑启动的0.1S内,电容两端的电压时在0~3.5V增加。这个时候10K电阻两端的电压为从5~1.5V减少
[单片机]
<font color='red'>51单片机</font>复位电路原理介绍
51单片机 温湿度传感器DHT11
//硬件连接: P2.0口为通讯口连接DHT1 #include reg51.h #include intrins.h typedef unsigned char U8; typedef signed char S8; typedef unsigned int U16; #define uchar unsigned char #define uint unsigned int sbit P2_0 = P2^0 ; sbit P2_1 = P2^1 ; //----------------------------------------------// //-------
[单片机]
Proteus使用笔记之51单片机4x4矩阵按键
采用反转法判断按键坐标,即行号与列号获得按键码。 写完后发现Proteus一个问题:直接使用这样的if(P1&0xf0!=0xf0)语句时,调不出来,当用了一个中间变量过渡时,就调出来了,害我花了一个上午的时间,现在暂时不知道Proteus为什么要这样,实际中是不需要的。 程序如下: #include reg52.h #define uchar unsigned char #define uint unsigned int void delayMS(unsigned int z); uchar keyscan(void); void main(void) { uchar key; while(1) {
[单片机]
51单片机—DAC0832(详细介绍)—06—①
DAC0832~相信大家都不陌生,想整理整理这个,三种方法吗~~所以这个也得两三篇吧~~慢慢来~~ 这一篇还是比较简单的介绍,不过也有注意的~~ 1、DAC0832的简介 1)DAC0832的引脚 当然第一就得是引脚,由于网上的这个东西比较多,那我就粘贴了~~ 2)DAC0832的内部结构(这个对于理解1还是很重要的~~ ,呵呵,这个应该放在1处) 这里一定注意了: 8位输入寄存器用于存放CPU送来的数字量,使得输入的数字量得到缓冲和锁存,由/LE1来控制。 8位DAC寄存器用于存放待转换的数字量,由/LE2控制 都是低电平有效啊~~ (当他们所对应的引脚都有效的时候,它们俩是高电平~~
[单片机]
<font color='red'>51单片机</font>—DAC0832(详细介绍)—06—①
AT89C51单片机在无线数据传输中的应用
一般的数字采集系统,是 通过 传感 器将捕捉的现场 信号 转换为电信号,经模/数转换器ADC采样、量化、编码后,为成数字信号,存入数据 存储器 ,或送给微处理器,或通过无线方式将数据发送给接收端进行处理。无线数据传输系统就是 样一套利用无线手段,将采集的数据由测量站发送到主控站的设备。 1 系统组成 系统组成如图1、图2所示。   系统由测量站和主控站两部分组成。测量站主要完成对现场信号的采集、存储,接收遥控 指令并 发送数据。主控站的主要工作是发送遥控指令、接收数据信息、进行数据处理和数据管理、随机显示打印等。 2 AT89C51与数字电台的串行通信 Atmel公司的AT89C51单片机,是一种低功耗、高 性能 的、片
[应用]
基于51单片机的自动转换开关控制器设计
1. 引言(Introduction) 随着近几年技术的进步和发展,在电源切换系统中出现了一种新型产品——自动转换开关电器(ATSE),它由1个(或几个)转换开关电器和其它必需的电器组成,用于监测电源电路,并将负载电路(出现故障)从一个电源自动转至另一个(备用)电源的开关电器,是专用于电源转换的新型产品,可以说自动转换开关电器(ATSE)代表着电源切换系统类产品发展的方向 。它主要用在紧急供电系统,如:消防、电梯等供电系统,在民用住宅和商用住宅中有着广泛的应用。其产品应用的场合决定了其可靠性尤为重要。转换一旦失败将会造成以下二种危害之一:电源间的短路或重要负荷断电(甚至短暂停电),其后果都是严重的。这不仅仅会带来经济损失(使生
[单片机]
基于<font color='red'>51单片机</font>的自动转换开关控制器设计
51单片机串口应用实例(汇编)
一、 实验题目 猜数字小游戏:串行口发送0x01、0x02、0x03 HEX数据中的一个到51单片机,对应的按键key1-key3,发送数据之后,另一边人员猜测对应的HEX码,并按下对应的按键,若按下正确的按键,则LED灯闪烁,按下不正确的按键,则蜂鸣器响一下报错,程序可以一直执行到猜中停止,此时按下key4清空复位运行数据,等待下一个串口发送的数据进行下一次猜数字。 二、 设计方案及电路 设计方案: 串口通过定时器1产生9600波特率,接收中断里面处理接收数据,主循环里面对接收数据进行判断,根据不同的HEX码转换到不同的按键判断任务,通过扫描的方式读取KEY1-3,判断读取的值,如果与HEX码对应的按键不同,则跳转到蜂鸣器报警
[单片机]
<font color='red'>51单片机</font>串口应用实例(汇编)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved