历史上的今天
返回首页

历史上的今天

今天是: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);

     

        }

}


推荐阅读

史海拾趣

Hirosugi-Keiki公司的发展小趣事

对于门控夜明灯电路,网友们可能会有多种问题,以下是一些常见问题及其详细回答:

一、工作原理相关问题

  1. 问:门控夜明灯电路是如何实现自动开关的?
    : 门控夜明灯电路主要通过门控开关、延迟电路、光控电路和电源电路等几部分组成。当门打开时,门控开关触发电路,使电灯点亮。同时,延迟电路控制电灯的点亮时间,一般为几十秒左右。光控电路则确保在光线较暗的环境下(如夜晚)电路才会工作,而在白天则自动封锁电路,避免电灯误亮。

  2. 问:电路中的光控部分是如何工作的?
    : 电路中的光控部分通常由光敏电阻器(如MG45型)和相关的电子元件组成。光敏电阻器的阻值会随着光照强度的变化而变化。在白天,由于光照强度大,光敏电阻器呈现低阻值状态,导致电路中的某个三极管(如VT3)导通,进而封锁整个电路,使电灯不会点亮。而在夜晚,光照强度减弱,光敏电阻器呈现高阻值状态,三极管截止,电路恢复正常工作状态,受门控开关控制。

二、安装调试相关问题

  1. 问:如何安装门控夜明灯电路?
    : 安装门控夜明灯电路时,首先需要将干簧管安装在门框上,将小磁铁安装在门上,并确保两者在门关闭时能够对准并吸合。接着,将电路板固定在合适的位置,并连接好电源线和电灯线。最后,进行电路调试,确保电路能够正常工作。

  2. 问:如何调整电灯的点亮时间?
    : 电灯的点亮时间主要由延迟电路中的电阻和电容决定。要调整点亮时间,可以通过改变电阻(如R2)的阻值或电容(如C1)的容量来实现。一般来说,电阻阻值增大或电容容量增大,都会导致点亮时间延长;反之,则点亮时间缩短。

三、故障排除相关问题

  1. 问:如果电灯不亮,可能是什么原因?
    : 如果电灯不亮,可能是由多种原因造成的。首先,应检查电源是否正常,以及电路中的保险丝是否熔断。其次,检查门控开关是否工作正常,即干簧管和小磁铁是否能够在门打开时正确触发电路。此外,还应检查光控电路是否因光线过强而处于封锁状态。最后,检查电灯本身是否损坏。

  2. 问:电灯在白天也会亮,怎么办?
    : 如果电灯在白天也会亮,可能是光控电路出现了问题。首先,应检查光敏电阻器是否损坏或受到其他光源的干扰。其次,检查与光敏电阻器相关的电子元件(如VT3)是否工作正常。如果问题依然存在,可能需要重新调整光控电路的灵敏度或更换相关元件。

四、其他相关问题

  1. 问:门控夜明灯电路适用于哪些场合?
    : 门控夜明灯电路适用于需要自动照明的各种场合,如家庭玄关、走廊、楼梯间等。它能够在人们进门时自动点亮电灯,为人们提供方便,同时也能够节省能源。

  2. 问:如何选择合适的电灯与电路匹配?
    : 在选择电灯与电路匹配时,首先需要考虑电灯的功率和类型。由于门控夜明灯电路通常设计为低功耗电路,因此建议选择功率较小、发光效率较高的电灯,如LED灯泡。此外,还需要确保电灯的电压和电流与电路的输出相匹配,以避免电路损坏或电灯烧毁。

BLACK&DECKER公司的发展小趣事

BLACK&DECKER一直致力于产品革新和专利申请。1914年,公司为世界第一台配有枪式手柄、扳机开关和通用马达的便携式手电钻申请了专利。这一发明极大地提高了工作效率,并在市场上取得了巨大的成功。此后,BLACK&DECKER不断推出创新产品,如1946年发明的世界上第一台专为家用消费者设计的便携式电钻,以及后续的电动篱笆剪、全绝缘电钻等一系列重要发明。

Amptek Inc公司的发展小趣事

BLACK&DECKER在技术创新方面一直走在行业前列。公司不断投入研发资源,推动电动工具技术的进步。例如,1979年,BLACK&DECKER发布了第一台手提式充电吸尘器Dustbuster,这一创新产品迅速成为市场上的热销产品,并推动了整个吸尘器行业的发展。此外,BLACK&DECKER还积极参与行业标准的制定工作,通过制定严格的产品质量标准和安全规范,为整个电子行业的健康发展做出了贡献。

Bellin Dynamic Systems公司的发展小趣事

随着公司规模的扩大和业务范围的拓展,Bellin Dynamic Systems开始注重品牌建设和市场推广。公司加大了对品牌形象的宣传力度,通过参加行业展会、举办技术研讨会等方式提升品牌知名度。同时,公司还加强了与媒体和客户的沟通互动,积极传递公司的价值观和企业文化。这些举措有效地提升了Bellin Dynamic Systems在市场上的影响力和竞争力。

BETA Transformer Technology Corp公司的发展小趣事

为了进一步扩大市场份额,BETA Transformer Technology Corp公司开始实施国际化战略。公司积极参加国际电子展览,与国际同行进行深入交流与合作。同时,BETA公司还在海外设立了研发中心和生产基地,以便更好地服务全球客户。通过不断拓展国际市场,BETA公司的品牌影响力和市场竞争力得到了显著提升。

Cermetek Microelectronics公司的发展小趣事

随着公司规模的扩大和业务的增长,Cermetek Microelectronics公司开始实施国际化战略。公司积极拓展海外市场,与多个国家和地区的客户建立了合作关系。同时,公司还在海外设立了研发中心和生产基地,以更好地服务全球客户。这种全球布局不仅提升了公司的国际竞争力,也为公司的长远发展奠定了坚实的基础。

问答坊 | AI 解惑

NS网上设计工具协助滤波器设计

美国国家半导体公司 (National Semiconductor)宣布推出一套功能齐备的网上设计工具 WEBENCH Active Filter Designer (有源滤波器设计套件) ,确保系统设计工程师可以在最短时间内成功开发一款适用于数据搜集及信号调节的新一代滤波器。这是一套全新 ...…

查看全部问答>

2006年 四川省大学生电子设计竞赛试题-简易数字频率计(内江师院)

本帖最后由 paulhyde 于 2014-9-15 09:46 编辑 电子设计竞赛试题简易数字频率计 一、电子设计竞赛设计任务: 设计并制作一台数字显示的简易频率计。 二、电子设计竞赛设计要求: 1、基本要求: (1)频率测量 测量范围:1HZ~1MHZ,信 ...…

查看全部问答>

基于CygnalF040的RTOS51的研究与开发

0.引 言 目前,我国对于大部分供电电力设备的监控和管理上基本还停留在人工巡查这种比较原始的管理方式下(例如铁路道口的信号电源),不但管理效率低下,而且供电质量和水平都得不到有效的保证。本文以实时操作系统small RTOS51为基础,主要探 ...…

查看全部问答>

定时器,计数器

定时、计数器原理及工作方式说明资料…

查看全部问答>

如何扩流啊

我用的是tps61202芯片,输入时1-4v的电压,输出是5v稳定电压,电流时0.6A,如何给电流增大到10A啊?…

查看全部问答>

WinCE SD卡升级

先说下我的目标:做SD卡升级 想问下bootloader怎么识别SD卡里面装的是升级文件而不是其他类型的文件?…

查看全部问答>

散分啦 要的来

今天心情比较好  散点分  ^_^…

查看全部问答>

优盘的清零或低格

最近在作一个小项目,就是实现优盘的清零或着说是低格,最终的目的就是对优盘操作后,无法用恢复软件恢复。例如:Finadata等。 另外我已经在vc.net下用过DeviceIoControl函数了参数IOCTL_DISK_FORMAT_TRACKS_EX和IOCTL_DISK_FORMAT_TRACKS返回的错 ...…

查看全部问答>

有关Verilog HDL 的问题

本人最近正在用VeriLog HDL语言编写一个异步FIFO,我采用的是二进制转换为格雷码来判空判满。但能力有限,两天下来都没有结果,希望得到高人指点。…

查看全部问答>

我这个只能显示3个数字,求变成显示4个

#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; //用于退出 ...…

查看全部问答>