写一个程序,需要两种模式,一个是设定工作目标设定速度用pid调节,一个是通过ad转换用电位器直接调节速度

查看: 31835|回复: 83
一起来学习PID
主题帖子精华
中级会员, 积分 243, 距离下一级还需 257 积分
在线时间0 小时
这个是我从各网站看到然后总结的,并结合自己的经验解说的。后面会结合2013大学生电子设计竞赛国赛中C题倒立摆进行讲述(持续更新)
一、总体原则
& & PID调试一般原则&
& & a.在输出不振荡时,增大比例增益P。&
& & b.在输出不振荡时,减小积分时间常数Ti。&
& & c.在输出不振荡时,增大微分时间常数Td。
二、各环节作用
&&&&[P]比例调节作用:是按比例反应系统的偏差,系统一旦出现了偏差,比例调节立即产生调节作用用以减少偏差。比例作用大,可以加快调节,减少误差,但是过大的比例,使系统的稳定性下降,甚至造成系统的不稳定。反之,过小,更不上系统需求。
&&&&[I]积分调节作用:是使系统消除稳态误差,提高无差度。因为有误差,积分调节就进行,直至无差,积分调节停止,积分调节输出一常值。积分作用的强弱取决与积分时间常数Ti,Ti越小,积分作用就越强。反之Ti大则积分作用弱,加入积分调节可使系统稳定性下降,动态响应变慢。一般情况是将时间常数设置很小。积分作用常与另两种调节规律结合,组成PI调节器或PID调节器。&
&&&&[D]微分调节作用:微分作用反映系统偏差信号的变化率,具有预见性,能预见偏差变化的趋势,因此能产生超前的控制作用,在偏差还没有形成之前,已被微分调节作用消除。因此,可以改善系统的动态性能。在微分时间选择合适情况下,可以减少超调,减少调节时间。微分作用对噪声干扰有放大作用,因此过强 的加微分调节,对系统抗干扰不利。此外,微分反应的是变化率,而当输入没有变化时,微分作用输出为 零。微分作用不能单独使用,需要与另外两种调节规律相结合,组成PD或PID控制器。
三、细说[分为PID、PI、PD]
& & 1、确定比例增益P&
& & 确定比例增益P 时,首先去掉PID的积分项和微分项,一般是令Ti=0、Td=0(具体见PID的参数设定说明),使PID为纯比例调节。输入设定为系统允许的最大值的60%~70%,由0逐渐加大比例增益P,直至系统出现振荡;再反过来,从此时的比例增益P逐渐减小,直至系统振荡消失,记录此时的比例增益P,设定PID的比例增益P为当前值的60%~70%。比例增益P调试完成。
& & &【解说】我们知道P是调节与预设值(即输入值)的偏差的作用的,因此P很大时,当反馈值很小时也会造成很大的波动,最终是震荡状态,这个可以试出来的,这时的P是Pmax。反之P太小时,根本不可能靠近预设值,当刚好能靠近预设值时,这时的P就是Pmin。一般取P = Pmax(*60~70%)。
& & 2、确定积分时间常数Ti
&&&&比例增益P确定后,设定一个较大的积分时间常数Ti的初值,然后逐渐减小Ti,直至系统出现振荡,之后在反过来,逐渐加大Ti,直至系统振荡消失。记录
此时的Ti,设定PID的积分时间常数Ti为当前值的150%~180%。积分时间常数Ti调试完成。
& & 【解说】
& & 3、确定积分时间常数Td积分时间常数Td一般不用设定,为0即可。若要设定,与确定 P和Ti 的方法相同,取不振荡时的30%。&
& & 【解说】
& & 【PID算法演示小软件(绿色版)】
四、具体实践
[C] 纯文本查看 复制代码/*日*/
unsigned long lastT
double Input, Output, S
double etSum, lastE
double kp, ki,
//output = kp*et + ki*etSum + kd*
void PidFunction()
/*How long since we last calculated*/
unsigned long now = millis();
//得到当前时间
double timeChange = (double)(now - lastTime);
//得到当前时间与上次时间之间的间隔
/*Compute all the working error variables*/
double et = Setpoint - I
//反馈值与输入值的差值 e(t) = 比例
etSum += (et* timeChange);
//差值*时间间隔乘积累加 = 积分
double dEt = (et - lastErr) / timeC
//差值-上一次差值 = 微分
/*Compute PID Output*/
Output = kp * et + ki * etSum + kd * dEt;
//输出 = 比例 + 积分 + 微分
/*Remember some variables for next time*/
//下次循环: 当前比例成为过去比例
lastTime =
//下次循环: 当前时间成为过去时间
void ParaSet(double Kp, double Ki, double Kd)
//设置比例、积分、微分的系数
& & 上面的程序代码是整个PID控制的模板。具体的看你的系统需求。下面我讲讲倒立摆(还不知道倒立摆是什么的可以去网上了解下)的PID控制:
【单个传感器实现倒立摆】
& &角度传感器(精密电位器):我们知道一般的精密电位器就可以当作传感器来使用,电位器三个脚,其中一端接GND,一端接VCC,那么中间端作为电压输出,通过AD采样既可以获取摆转过的角度位置。自然在摆的最高点就有一个角度值。为了获得较好的控制周期,我们采用定时器中断的方式,即在定时器中断中进行采样和数据处理,并进行电机控制(放心,STM32运行速度足够了)。这里取定时器三毫米中断一次,注意,AD采样的时间一定要小于定时器中断时间,否则会出现时序错乱,可以在AD初始化中设定采样周期,或者在中断函数里面进行适当的处理,比如分三次采样取平均值(这个需要设定更小的中断时间,如一毫秒中断一次,我就是这样的做的)。定时器初始化和一些变量的定义我就没贴代码了,具体的代码如下:
[C] 纯文本查看 复制代码void TIM3_IRQHandler(void)
if(TIM3-&SR&0X0001){
//溢出中断
LED1 = ~LED1;
timercount++;
TIM3-&SR &= ~(1&&0);
//清除中断标志位
if(timercount == 1){
ang[0] = Get_Adc(ADC_CH1);
if(timercount == 2){
ang[1] = Get_Adc(ADC_CH1);
if(timercount == 3){
////////////angle PID///////////
ang[2] = Get_Adc(ADC_CH1);
//采集AD值
angleLast =
//保存上一次的采样角度值
angle = (ang[0]+ang[1]+ang[2])/3;
//取三次采集的平均值
degreeLast =
//保存上一次的计算角度值
degree = calcAngle(angle);
//获取新的计算角度值
velocity = (angle - angleLast);
//得到采样角速度差值(微分值)
if(abs(angle-setPoint)&=4)
//输入值与反馈值差的绝对值
error_p = 0;
error_p = setPoint-
//p = 输入值与反馈值差
//d = 微分值
error_i = error_i + (error_p*timechange);
myspeed = - (kp*error_p + ki*error_i + kd*error_d);
setMotorSpeed(myspeed);
//电机PID控制
//printf(\"[%d %d %d %7d]\t\",angle,degree,myspeed,error_i);
if(timercount == 3){
timercount = 0;
error_i = isOverFlow(error_i);
& & 电机速度控制代码:
[C] 纯文本查看 复制代码void setMotorSpeed(long mySpeed)
long output = 0;
mySpeed = constrain(mySpeed,-); //限制速度上下限
if(mySpeed == 0)mySpeed = 1;
//保证速度不为零,也可以不用
if(mySpeed&0){
output = mySpeed*1.0;
//这个具体的看系统进行调整放大
//printf(\"R:%d\t\",output);
TurnLeft(output);
output = mySpeed*(-1.0);
//printf(\"L:%d\t\",output);
TurnRight(output);
& & 速度控制的话,我的速度值调节范围为0~5000,这个可以通过定时器来设定的。
& &效果如下:
【多个传感器实现倒立摆】
10:01 上传
点击文件名下载附件
194.03 KB, 下载次数: 8932
22:45 上传
点击文件名下载附件
460.82 KB, 下载次数: 14917
主题帖子精华
在线时间44 小时
等大神呢。。。。。。
主题帖子精华
中级会员, 积分 243, 距离下一级还需 257 积分
在线时间0 小时
回复【2楼】:
---------------------------------
慢慢更
主题帖子精华
金钱128996
在线时间1151 小时
谢谢分享....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
主题帖子精华
初级会员, 积分 77, 距离下一级还需 123 积分
在线时间5 小时
谢谢楼主,坐等更新。。。
主题帖子精华
初级会员, 积分 67, 距离下一级还需 133 积分
在线时间13 小时
感谢分享......
主题帖子精华
中级会员, 积分 237, 距离下一级还需 263 积分
在线时间10 小时
搬个板凳听课了···
在你没有做出成绩之前,这个世界不会在乎你的自尊。
主题帖子精华
新手入门, 积分 22, 距离下一级还需 -2 积分
在线时间0 小时
最近正好在做这个,顶一个
主题帖子精华
在线时间469 小时
不错,谢谢分享
主题帖子精华
新手入门, 积分 22, 距离下一级还需 -2 积分
在线时间0 小时
请问楼主是如何将读取的AD值通过PID转换成用来控制电机的PWM的TIMX-&CCRX的?
主题帖子精华
中级会员, 积分 243, 距离下一级还需 257 积分
在线时间0 小时
回复【10楼】elecfans:
---------------------------------
这个不是PID处理后有个输出吗?那个就是电机的速度控制量,然后赋值给CCRX就好了。
主题帖子精华
初级会员, 积分 190, 距离下一级还需 10 积分
在线时间0 小时
留着有用再来看
主题帖子精华
新手入门, 积分 22, 距离下一级还需 -2 积分
在线时间0 小时
楼主真的是太帅了,太爱你了
主题帖子精华
新手入门, 积分 22, 距离下一级还需 -2 积分
在线时间0 小时
回复【11楼】回首看那个曾经的我:
---------------------------------
嘿嘿
主题帖子精华
初级会员, 积分 165, 距离下一级还需 35 积分
在线时间0 小时
楼主,软件使用过期了...求一个新的
要么不做,要么做到最好。。
主题帖子精华
新手入门, 积分 49, 距离下一级还需 -29 积分
在线时间0 小时
楼主你好,请问millis()这个函数是自己定义的吗?
主题帖子精华
中级会员, 积分 243, 距离下一级还需 257 积分
在线时间0 小时
回复【16楼】逍遥winter:
---------------------------------
就是告诉你采下样周期的获取,采样周期可以自己设定,这只是为了形象的表示下。你也可以真实的写出这个函数来。
主题帖子精华
初级会员, 积分 60, 距离下一级还需 140 积分
在线时间0 小时
楼主你好,这个代码是控制减速直流电机的吧?通过控制PWM波的占空比,改变加在电机两端的平均电压,进而改变输出扭矩,如果是步进电机,该如何控制改变输出扭矩呢?换句话说,步进电机该怎么控制摆杆摆动幅度?
主题帖子精华
新手入门, 积分 27, 距离下一级还需 -7 积分
在线时间0 小时
这个必须MARK
主题帖子精华
初级会员, 积分 84, 距离下一级还需 116 积分
在线时间10 小时
主题帖子精华
新手入门, 积分 21, 距离下一级还需 -1 积分
在线时间0 小时
学习了,谢谢楼主
主题帖子精华
中级会员, 积分 214, 距离下一级还需 286 积分
在线时间0 小时
回复【3楼】回首看那个曾经的我:
---------------------------------
楼主&对于pid编程一点都不了解&希望&能提供给一些资料,建议,谢谢了亲
主题帖子精华
中级会员, 积分 302, 距离下一级还需 198 积分
在线时间22 小时
楼主能不能把整个程序发出来啊,我看的比较迷惑,我最近要做一个项目,要用到PID,比较急
主题帖子精华
初级会员, 积分 174, 距离下一级还需 26 积分
在线时间19 小时
回复【23楼】张仁良:
---------------------------------
同求~
主题帖子精华
新手入门, 积分 29, 距离下一级还需 -9 积分
在线时间1 小时
跪拜了,真心牛逼!!小弟刚刚开始要做PID的温控,CO2浓度控,跟着大神学了。
主题帖子精华
中级会员, 积分 335, 距离下一级还需 165 积分
在线时间0 小时
去年就是因为不懂PID所以没做出来,需要这样的帖子哇。
主题帖子精华
初级会员, 积分 84, 距离下一级还需 116 积分
在线时间0 小时
新手刚开始用STM32开始做PI控制,我想问的是PID的控制模板在STM32中也是适用的?我所控制对象是功率电路,不涉及电机。
主题帖子精华
中级会员, 积分 312, 距离下一级还需 188 积分
在线时间36 小时
谢谢分享&留名学习
主题帖子精华
新手入门, 积分 21, 距离下一级还需 -1 积分
在线时间0 小时
不知道那个软件怎么用?菜鸟求教
主题帖子精华
新手入门, 积分 27, 距离下一级还需 -7 积分
在线时间0 小时
isOverFlow具体是如何实现的,需要剔除之前的值吗
主题帖子精华
新手入门, 积分 22, 距离下一级还需 -2 积分
在线时间0 小时
没然后了吗???求解答
主题帖子精华
金牌会员, 积分 1519, 距离下一级还需 1481 积分
在线时间259 小时
顶一个。。。
STM32---STM32---STM32---STM32---STM32---STM32---STM32---STM32---STM32
主题帖子精华
新手入门, 积分 24, 距离下一级还需 -4 积分
在线时间1 小时
正需要!!!
主题帖子精华
新手入门, 积分 48, 距离下一级还需 -28 积分
在线时间5 小时
谢谢&=&&-=不过资料不够啊
主题帖子精华
新手入门, 积分 21, 距离下一级还需 -1 积分
在线时间0 小时
楼主可以帮整个代码发一下吗,,有些疑惑
主题帖子精华
新手入门, 积分 22, 距离下一级还需 -2 积分
在线时间0 小时
changetime代表什么呢
主题帖子精华
新手入门, 积分 22, 距离下一级还需 -2 积分
在线时间0 小时
回复【2楼】:
---------------------------------为什么D没有加filter
主题帖子精华
新手入门, 积分 45, 距离下一级还需 -25 积分
在线时间2 小时
顶顶顶顶顶顶顶顶顶顶顶顶
主题帖子精华
新手入门, 积分 45, 距离下一级还需 -25 积分
在线时间2 小时
再加个位置闭环吧,就可以不让它旋转了。这样看着都晕。。
主题帖子精华
新手入门, 积分 21, 距离下一级还需 -1 积分
在线时间0 小时
MARK,正在学习PID算法
主题帖子精华
新手入门, 积分 27, 距离下一级还需 -7 积分
在线时间0 小时
e0da17e22_500.png (0 Bytes, 下载次数: 3)
22:54 上传
主题帖子精华
初级会员, 积分 76, 距离下一级还需 124 积分
在线时间3 小时
最近也在做这个,必须顶
主题帖子精华
初级会员, 积分 76, 距离下一级还需 124 积分
在线时间3 小时
软件怎么用呢?设定参考线没法设置啊?求助
主题帖子精华
初级会员, 积分 163, 距离下一级还需 37 积分
在线时间9 小时
那个模拟pid的软件怎么调整参数都没有超调啊,这是什么问题?????
主题帖子精华
初级会员, 积分 73, 距离下一级还需 127 积分
在线时间7 小时
谢谢楼主分享 学习了
主题帖子精华
新手入门, 积分 24, 距离下一级还需 -4 积分
在线时间0 小时
回复【17楼】回首看那个曾经的我:
---------------------------------
回复【17楼】回首看那个曾经的我:
---------------------------------
大哥,有没有用pid控制一个电机的速度和位置的程序和资料,急用,非常感谢。
主题帖子精华
初级会员, 积分 73, 距离下一级还需 127 积分
在线时间7 小时
好东西&&谢谢分享
主题帖子精华
初级会员, 积分 78, 距离下一级还需 122 积分
在线时间22 小时
大神能解释下&&pid算法中的采样时间的选择和电机速度的更新时间的大概关系。。。。。还有电机控制中的位置控制介绍一下。。求指点、、、、、、、
主题帖子精华
金牌会员, 积分 1432, 距离下一级还需 1568 积分
在线时间169 小时
去年暑假我们做的是风力摆,前年做的是四轴都是用的PID
主题帖子精华
初级会员, 积分 61, 距离下一级还需 139 积分
在线时间6 小时
你这个是1相步进电机吗
只有一个pwm?????????
Powered by积分式AD转换器的设计
本设计为16位高分辨率的三斜积分式AD转换器, A/D转换器部分采用普通元器件构成模拟部分,利用MEGA8单片机借助软件实现数字计数显示功能,同时采用MEGA8单片机编程实现电压信号的自动转换、自动校零、和液晶显示等功能。
积分式AD转换器的设计&
摘要:本设计为16位高分辨率的三斜积分式AD转换器, A/D转换器部分采用普通元器件构成模拟部分,利用MEGA8单片机借助软件实现数字计数显示功能,同时采用MEGA8单片机编程实现电压信号的自动转换、自动校零、和液晶显示等功能。
AD转换器的精度和准确度,直接决定了我们设备的精度及准确度。而由于印制电路板以及信号传输等物理上带来的误差,还需要有效的对AD高精度转换进行校正,消除物理上带来的误差。
关键词:三斜积分,A/D转换,电压测量
1.1课题背景
 A/D转换器的功能是把模拟量变换成数字量。由于实现这种转换的工作原理和采用工艺技术不同,因此生产出种类繁多的A/D转换芯片。A/D转换器按分辨率分为4位。6位。8位。10位。14位。16位和bcd码的31/2位。51/2位等。按照转换速度可分为超高速(转换时间≤330ns),次超高速(330~3.3μs),高速(转换时间3.3~333μs),低速(转换时间>330μs)等。A/D转换器按照转换原理可分为直接A/D转换器和间接A/D转换器。所谓直接A/D转换器,是把模拟信号直接转换成数字信号,如逐次逼近型,并联比较型等。其中逐次逼近型A/D转换器,易于用集成工艺实现,且能达到较高的分辨率和速度,故目前集成化A/D芯片采用逐次逼近型者多;间接A/D转换器是先把模拟量转换成中间量,然后再转换成数字量,如电压/时间转换型(积分型),电压/频率转换型,电压/脉宽转换型等。其中积分型A/D转换器电路简单,抗干扰能力强,切能作到高分辨率,但转换速度较慢。有些转换器还将多路开关。基准电压源。时钟电路。译码器和转换电路集成在一个芯片内,已超出了单纯A/D转换功能,使用十分方便。
1.2嵌入式单片机的发展
8048和8748是最早期的产品,8048本身具有64x8位RAM,1kx8位的ROM,而后期的8049中的RAM大到256字节,ROM却增加到了4kBytes,这个成绩在当时是相当可喜的。还有一类的产品本身是不带程序存储器的,象8035和8039,它的程序存储器只能外接,当时常用的是EPROM(紫外线擦除电写只读程序存储器)一类的ROM。&&&
MCS-48系列单片机还有几个产品,象8021和8022单片机,8021该系列中的低价型单片机,而8022则是包含了单片机所有功能,并集成了A/D转换器的产品。&&
现在MCS-48系列单片机已完全退出了历史舞台,由MCS-51系列单片机取而代之,STC-51单片机,AVR系列单片机,以及高速度的ARM及FPGA/CPLD均得到了迅猛发展。但51单片机,其低廉的价格,其体积小、价格低廉、稳定可靠、仍广泛应用于家电控制、通讯、工业控制、智能仪器仪表、金融电子等许多领域。
1.3A/D转化电路简介
亦称“模拟数字转换器”,简称“模数转换器”。将模拟量或连续变化的量进行量化(离散化),转换为相应的数字量的电路。
A/D变换包含三个部分:抽样、量化和编码。一般情况下,量化和编码是同时完成的。
抽样是将模拟信号在时间上离散化的过程;
量化是将模拟信号在幅度上离散化的过程;
编码是指将每个量化后的样值用一定的二进制代码来表示。
1.3.1A/D转化含义
随着数字技术,特别是信息技术的飞速发展与普及,在现代控制。通信及检测等领域,为了提高系统的性能指标,对信号的处理广泛采用了数字计算机技术。由于系统的实际对象往往都是一些模拟量(如温度。压力。位移。图像等),要使计算机或数字仪表能识别。处理这些信号,必须首先将这些模拟信号转换成数字信号;而经计算机分析。处理后输出的数字量也往往需要将其转换为相应模拟信号才能为执行机构所接受。这样,就需要一种能在模拟信号与数字信号之间起桥梁作用的电路-模数和数模转换器。
将模拟信号转换成数字信号的电路,称为模数转换器(简称A/D转换器或adc,analog
to digital converter);将数字信号转换为模拟信号的电路称为数模转换器(简称D/A转换器或dac,digital to analog converter);A/D转换器和D/A转换器已成为信息系统中不可缺少的重要的电子器件,为确保系统处理结果的精确度,A/D转换器和D/A转换器必须具有足够的转换精度;如果要实现快速变化信号的实时控制与检测,A/D与D/A转换器还要求具有较高的转换速度。转换精度与转换速度是衡量A/D与D/A转换器的重要技术指标。随着集成技术的发展,现已研制和生产出许多单片的和混合集成型的A/D和D/A转换器,它们具有愈来愈先进的技术指标。
1.3.2性能参数
D/A转换器是把数字量转换成模拟量的线性电路器件,已做成集成芯片。由于实现这种转换的原理和电路结构及工艺技术有所不同,因而出现各种各样的D/A转换器。目前,国外市场已有上百种产品出售,他们在转换速度。转换精度。分辨率以及使用价值上都各具特色。
D/A转换器的主要参数:
衡量一个D/A转换器的性能的主要参数有:
是指D/A转换器能够转换的二进制数的位数,位数多分辨率也就越高。
(2)转换时间
指数字量输入到完成转换,输出达到最终值并稳定为止所需的时间。电流型D/A转换较快,一般在几ns到几百ns之间。电压型D/A转换较慢,取决于运算放大器的响应时间。
指D/A转换器实际输出电压与理论值之间的误差,一般采用数字量的最低有效位作为衡量单位。
当数字量变化时,D/A转换器输出的模拟量按比例关系变化的程度。理想的D/A转换器是线性的,但是实际上是有误差的,模拟输出偏离理想输出的最大值称为线性误差。
2系统开发环境软硬件概述
2.1ATmega8/8L 介绍
ATmega8 属于美国 ATMEL 公司 AVR 高档单片机成员之一,它具有
AVR 高档单片机的性能,且具有低档单片机的价格,深受广大单片机用户的喜爱尤其 AVR 单片 机不需购买昂贵的仿真器 编程器也可搞单片机的开发应用,这对单片机初学者 尤为重要 ATmega8 的高性能低价格,在产品应用市场上极具强大的竞争力,被很 多家用电器厂商 仪器仪表行业看中, 从而使 ATmega8 进入大批量的应用领域。
ATmega8 是一款基于 AVR RISC 的低功耗 CMOS 的 8 位单片机 通过在一个时钟周期内执行一条指
令&&& ATmega8 可以取得
1MIPS/MHz 的性能而使得设计人员可以在功耗和执行速度之间取得平衡。
ATmega8/8L 带 8K 字节 FLASH 的在线可编程 8 位微控制器的特点
2高性能 低功耗的 AVR 8 位微控制器
2先进的 RISC 精简指令集结构
(1)130 条功能强大的指令 大部分在单时钟周期内执行
(2)32 X 8 个通用工作寄存器
(3)工作在 16 MHz 下 具有 16MIPS 的性能
(4)片内带有执行时间为两个时钟周期的硬件乘法器
2非易失性程序和数据存储器
(1)8K 字节在系统自编程 FLASH 擦写次数 1000 次
(2)BOOT 区具有独立的加密位 可通过片内的引导程序实现在系统编程写操作时真正可读
(3)512 字节 EEPROM&& 擦写次数& 100, 000 次
(4)1K 字节内部 SRAM
(5)程序加密位
(1)两个带预分频器和一种比较模式的 8 位定时/计数器
(2)一个带预分频器和比较模式&&& 捕获模式的 16 位定时/计数器
(3)具有独立振荡器的实时计数器
(4)三通道 PWM
(5)TQFP 和 MLF 封装芯片 有 8 通道的 A/D 转换 其中包括&& 6
路 10 位转换精度的通道,2 路 8 位转换精度的通道
(6)PDIP 封装芯片 有 6 路通道的 A/D 转换 其中包括 4 路 10 位转换精度的通道,2 路 8 位转换精度的通道
(7)两线(I2C)串行接口
(8)可编程串行 UART 接口
(9)主/从 SPI 串行接口
(10)带内部振荡器的可编程看门狗定时器
(11)片内模拟比较器
2特别的 MCU 特点
(1)上电复位和可编程的低电压检测
(2)内部可校准的 RC 振荡器
(3)外部和内部中断源
(4)五种睡眠模式
空闲模式& ADC 噪声抑制模式& 省电模式&& 掉电模式&& 待命模式
2I/O 口和封装
(1)23 个可编程 I/O 口
(2)28 脚 PDIP 封装& 32
脚 TQFP 封装&& 32 脚 MLF 封装
(1)2.7&&& 5.5V(ATmega8L)
(2)4.5&&& 5.5V(ATmega8)
(1)0& 8MHz ATmega8L
(2)0& 16MHz ATmega8
2在 4MHz&& 3V& 25 C 的功耗
(1)激活模式& 3.6mA
(2)空闲模式& 1.0mA
(3)掉电模式& 0.5 A
2.2CD4066简介
CD4066是四双向模拟开关,主要用作模拟或数字信号的多路传输。引出端排列与CC4016一致,但具有比较低的导通阻抗。另外,导通阻抗在整个输入信号范围内基本不变。CD4066由四个相互独立的双向开关组成,每个开关有一个控制信号,开关中的p和n器件在控制信号作用下同时开关。这种结构消除了开关晶体管阈值电压随输入信号的变化,因此在整个工作信号范围内导通阻抗比较低。与单通道开关相比,具有输入信号峰值电压范围等于电源电压以及在输入信号范围内导通阻抗比较稳定等优点。但若应用于采保,仍推荐CD4016。
&当模拟开关的电源电压采用双电源时,例如 =5V, =5V(均对地0V而言),则输入电压对称于0V的正、负信号电压(5V~5V)均能传输。这时要求控制信号C=“1”为+5V,C=“0”为-5V,否则只能传输正极性的信号电压。
引脚定义如下:
&&&&&&&&&&&&&&&&&&&&&&&&&&&
图<span style="font-size:10.0line-height:150%;font-family:V
color:#-1 引脚 功能图
CD4066是四双向模拟开关,集成块SCR1~SCR4为控制端,用于控制四双向模拟开关的通断。当SCR1接高电平时,集成块①、②脚导通,+12V→K1→集成块①、②脚→电源负极使K1吸合;反之当SCR1输入低电平时,集成块①、②脚开路,K1失电释放,SCR2~SCR4输入高电平或低电平时状态与SCR1相同。
2.3Proteus仿真软件简介
Proteus ISIS是英国Labcenter公司开发的电路分析与实物仿真软件[9]。它运行于Windows操作系统上,可以仿真、分析(SPICE)各种模拟器件和集成电路,该软件的特点是:①实现了单片机仿真和SPICE电路仿真相结合。具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。②支持主流单片机系统的仿真。目前支持的单片机类型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。③提供软件调试功能。在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如Keil C51 uVision2等软件。④具有强大的原理图绘制功能。总之,该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大。
Proteus主要用于绘制原理图并可进行电路仿真,Proteus
ARES 主要用于PCB 设计。ISIS 的主界面主要包括:1 是电路图概览区、2 是元器件列表区、3
是绘图区。绘制电路图的过程如下:
单击2 区的P 命令即弹出元器件选择(Pick Devices)对话框,Proteus 提供了丰富的元器件资源,包括30 余种元器件库,有些元器件库还具有子库。利用该对话框提供的关键词(Keywords)搜索功能,输入所要添加的元器件名称,即可在结果(Results)中查找,找到后双击鼠标左键即可将该元器件添到2 区,待所有需要的元器件添加完成后点击对话框右下角的OK 按钮,返回主界面。接着在2 区中选中某一个元器件名称,直接在3 区中单击鼠标左键即可将该元器件添加到3 区。
由于是英国的软件,特别要注意的是绘图区中鼠标的操作和一般软件的操作习惯不同,这正像是司机座位和人行道走向和国内不同一样。单击左键是完成在2 区中被选中的元器件的粘贴功能;将鼠标置于某元器件上并单击右键则是选中该元器件(呈现红色),若再次单击右键的话则删除该元器件,而单击左键的话则会弹出该元器件的编辑对话框(Edit Component);若不需再选中任何元器件,则将鼠标置于3 区的空白处单击右键即可;另外如果想移动某元器件,则选中该元器件后再按住鼠标左键即可将之移动。
元器件之间的连线方法为:将鼠标移至元器件的某引脚,即会出现一个“×”符号,按住鼠标左键后移动鼠标,将线引至另一引脚处将再次出现符号“×”,此时单击鼠标左键便可完成连线。连线时在需拐弯的地方单击鼠标左键即可实现方向的改变。绘制好电路后,可利用1 区的绿色边框对3 区的电路进行定位。
2.4Keil编译及调试软件简介
目前流行的51系列单片机开发软件是德国Keil公司推出的Keil C51软件,它是一个基于32位Windows环境的应用程序,支持C语言和汇编语言编程,其6.0以上的版本将编译和仿真软件统一为μVision(通常称为μV2)。Keil提供包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,由以下几部分组成:μVision IDE集成开发环境(包括工程管理器、源程序编辑器、程序调试器)、C51编译器、A51汇编器、LIB51库管理器、BL51连接/定位器、OH51目标文件生成器以及Monitor-51、RTX51实时操作系统。
应用Keil进行软件仿真开发的主要步骤为:编写源程序并保存――建立工程并添加源文件――设置工程――编译/汇编、连接,产生目标文件――程序调试。Keil使用“工程”(Project)的概念,对工程(而不能对单一的源程序)进行编译/汇编、连接等操作。工程的建立、设置、编译/汇编及连接产生目标文件的方法非常易于掌握。首先选择菜单File―New…,在源程序编辑器中输入汇编语言或C语言源程序(或选择File―Open…,直接打开已用其他编辑器编辑好的源程序文档)并保存,注意保存时必须在文件名后加上扩展名.asm(.a51)或.c;然后选择菜单Project―New Project…,建立新工程并保存(保存时无需加扩展名,也可加上扩展名.uv2);工程保存后会立即弹出一个设备选择对话框,选择CPU后点确定返回主界面。这时工程管理窗口的文件页(Files)会出现“Target1”,将其前面+号展开,接着选择Source Group1,右击鼠标弹出快捷菜单,选择“Add File to Group ‘Source Group1’”,出现一个对话框,要求寻找并加入源文件(在加入一个源文件后,该对话框不会消失,而是等待继续加入其他文件)。加入文件后点close返回主界面,展开“Source Group1”前面+号,就会看到所加入的文件,双击文件名,即可打开该源程序文件。紧接着对工程进行设置,选择工程管理窗口的Target1,再选择Project―Option
for Target ’Target1’(或点右键弹出快捷菜单再选择该选项),打开工程属性设置对话框,共有8个选项卡,主要设置工作包括在Target选项卡中设置晶振频率、在Debug选项卡中设置实验仿真板等,如要写片,还必须在Output选项卡中选中“Creat Hex Fi”;其他选项卡内容一般可取默认值。工程设置后按F7键(或点击编译工具栏上相应图标)进行编译/汇编、连接以及产生目标文件。&&&
成功编译/汇编、连接后,选择菜单Debug―Start/Stop Debug Session(或按Ctrl+F5键)进入程序调试状态,Keil提供对程序的模拟调试功能,内建一个功能强大的仿真CPU以模拟执行程序。Keil能以单步执行(按F11或选择Debug―Step)、过程单步执行(按F10或选择Debug―Step Over)、全速执行等多种运行方式进行程序调试。如果发现程序有错,可采用在线汇编功能对程序进行在线修改(Debug―Inline Assambly…),不必执行先退出调试环境、修改源程序、对工程重新进行编译/汇编和连接、然后再次进入调试状态的步骤。对于一些必须满足一定条件(如按键被按下等)才能被执行的、难以用单步执行方式进行调试的程序行,可采用断点设置的方法处理(Debug―Insert/Remove Breakpoint或Debug―Breakpoints…等)。在模拟调试程序后,还须通过编程器将.hex目标文件烧写入单片机中才能观察目标样机真实的运行状况。
Keil软件Eval版(免费产品)的功能与商业版相同,只是程序的最大代码量不得超过2kB,但对初学者而言已是足够。Keil软件由于其强大的软件仿真功能,友好的用户界面以及易于掌握的特点而受到工程技术人员的欢迎,有人甚至认为Keil是目前最好的51单片机开发应用软件。
3系统硬件设计
3.1总体电路构成
本系统由输入放大与量程转换电路、三斜积分A/D转换电路、单片机计数控制电路、LCD数字显示器构成。总体结构框图如图1所示。
图1& 总体电路框图
3.2各单元电路设计
3.2.1输入放大电路的设计
输入放大与量程自动转换电路的主要作用是提高输入阻抗和完成量程转换,本设计采用OP07集成运算放大器构成同相比例放大电路,以提高电路的输入阻
抗,以达到题目要求,模拟开关CD4066在单片机的控制下形成不同的通断组合,实现量程的自动转换和自动校零功能。
输入电路的主要作用是提高输入阻抗和实现量程的转换。输入电路的核心是输入放大器和模拟开关CD4066组成的量程自动转换电路,如图2所示。TG1、TG2是单片机控制的模拟开关,采用CD4066芯片,控制不同的增益。各种组合分析如下:
(1)200mv量程。TG2导通,放大电路被接成电压串联负反馈放大器。放大倍数Af及最大的输出电压Uomx分别为:
&&&&&&&&&&&&&&&&&&
图2 输入放大与量程自动转换电路
Uomx=200mV×20=4V
(2)2V量程。TG1导通,此时的电压放大倍数Af及最大的输出电压Uomx分别为:&&&&&&&&&&&&&&
Uomx=200×20=4V
由上述计算可见,输入A/D转换器的规范电压为0-4V,同时电路被接成了电压串联负反馈放大器形式,输入电阻高达10000&#13249;,完全达到题目的要求,电路输入端采用RC低通滤波电路抑制交流干扰。
3.2.2积分式A/D转换器的设计
虽然双积分式A/D转换器具有抗干扰能力强的特点,在采用零点校准的前提下,其转换精度也可以做得很高,但显著的不足是转换速度较慢,并且分辨率越高,其转换速度也就越慢。因此本设计采用了分立元件构成的三斜积分式A/D转换器,可以较好的改善转换速度慢的缺点,它的转换速率分辨率的乘积比传统的双积分式A/D转换器提高至少两个数量级。
三斜积分式A/D转换器的原理图
图3是一个三斜积分式A/D转换器的原理图。它由基准电压-VREF、
、积分器、比较器和由单片机构成的计数控制电路组成。
转换开始前,先将计数器清零,并接通S0使电容C完全放电。转换开始,断开S0。整个转换过程分三步进行:
首先,令开关S1置于输入信号Ui一侧。积分器对Ui进行固定时间T1的积分。积分结束时积分器的输出电压为:
可见积分器的输出电压与Ui成正比。这一过程也称为转换电路对输入模拟电压Ui的采样过程。
三斜积分式A/D转换波形图
在采样开始时,逻辑控制电路将计数门打开,计数器对周期为Tc的计数脉冲CP计数。当计数器达到满量程N1,此时计数器由全“1”恢复为全“0”,这个时间正好等于固定的积分时间T1, 。计数器复“0”时,同时给出一个溢出脉冲(即进位脉冲)使控制逻辑电路发出信号,令开关S1转换至参考电压-VREF一侧,采样阶段结束。三斜积分式A/D转换器的转换波形是将双积分式A/D的反向积分阶段T2分为图4所示的T21、T22两部分。在T21期间,积分器对基准电压-VREF进行积分,放电速度较快;在T22期间积分器改为对较小的基准电压 进行积分,放电速度较慢。在计数时,把计数器也分为两段进行计数。在T21期间,从计数器的高位(2m位)开始计数,设其计数值为N1;在T22期间,从计数器的低位(20位)开始计数,设其计数值为N2。则计数器中最后的读数为:
N= N1×2m+N2
在一次测量过程中,积分器上电容器的充电电荷与放电电荷是平衡的,则
|Ux|T1=VREFT21+(VREF/2m)T22
T21=N1Tc &&&T22=N2Tc
将上式加以整理得:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
将上式进一步整理,可得三斜式积分式A/D转化器的基本关系式为
&& 本设计中,取m=8,时钟脉冲周期Tc=120us,基准电压VREF=5V,并希望把2V被测电压变换成N=65536码读数时,由上式可以计算出T1=76.8ms,而传统的双积分式A/D转换器在相同的条件下所需的积分时间T1=307.2s,可见三斜积分式A/D转换器可以使转换速度大幅度提高。
3.2.3基准电压产生电路
图8 基准电压信号生成电路
自行设计了一个从0―100mV连续调节的模拟电压信号作为该系统的基准电压源,选用TL431AA,其电压精度可以达到0.5%;两组电压跟随器选用精密运放OP07;可变电阻RW101、RW103选用多圈精密可变电阻;电位器RW102选用10圈线绕精密电位器。由TL431产生2.50V电压,经电位器RW101分压得到100mV电
压送给第一组电压跟随器(由IC101组成)输入端。第一组电压跟随器的输出由多圈精密电位器RW102进行分压,分压后的信号由第二组电压跟随器(由U2组成)输出0--100mV的可调电压作为A/D转换电路的电压基准。
3.2.4单片机计数、控制电路的设计
通过对A/D转换电路的方案分析,本设计采用三斜积分电路和单片机编程实现A/D转换。脉冲的计数功能由单片机实现,所以对单片机的速度提出了较高的要求。本课题基本要求分辨率为11位,转换速度不低于2次/S;发挥部分要求分辨率15位,若采用MCS-51单片机实现控制和脉冲计数,转换速度较慢。因此本设计采用了MEGA8单片机实现控制和脉冲计数。MEGA8单片机具有速度高、超功能精简指令等特点,采用16MHZ晶振,完全能满足分辨率15位和转换速度2次/S的要求。
本设计测量分辨率为1mV(2V档),因此计数器至少要11位,发挥部分要求测量分辨率为0.1mV(2V档),计数器至少要15位,故本设计采用MEG8单片机实现控制和脉冲计数,构成16位计数器,内部采用16MHZ晶振,完全满足分辨率15位和转换速度2次/S的要求。
K1~K8,分别接8路信号,8个IO口,分别计数。采用MEGA8单片机实现对CD4066模拟开关的通断控制,从而实现量程自动转换、自动校零以及三斜积分A/D转换过程的控制;同时利用单片机编程实现16位高速计数功能。显示部分采用1602LCD液晶显示器实现A/D转换数据和测量电压值的显示。
3.2.5显示电路
本设计采用点阵式液晶显示器(LCD)显示。液晶显示器显示功能强大,可显示各种字体的数字、图像,还可以自定义显示内容,增加了显示的美观性与直观性。最重要的是提供了友好的人机界面。
原理图如下:
4系统程序设计
4.1三斜积分A/D转换器模拟电路部分
图5 三斜积分A/D转换器模拟电路部分
&& 图5为三斜积分A/D转换器模拟电路部分,图中放大电路选用精密运放OP07;积分电路也选用OP07;积分电容选用漏电流很小且等效串联电阻、电感都很小的CBB80电容;比较器选用LM311;图中的电子开关U1、U2均选用模拟开关CD4066芯片,只要将CD4066控制端接到单片机不同控制端口PBX上即可实现不同的开关通断控制。
4.2主程序流程图
5测试方案与测试结果
为了确定系统与题目要求符合程度,我们对系统中关键部分进行了实际测试。
5.1分辨率和测量误差
我们从信号源输入0―2V连续调节的直流电压信号作为该系统的被测信号源,对A/D转换电路的分辨率和测量误差进行了测试。选取被测信号源的1mV、5mV、50mV、150mV、200mV、300mV、500mV、1V、1.5V、2V点作为测试电压,分别进行了测试,结果见表1:
输入电压(mV)
显示数据(字)
显示电压值(mV)
输入电压(V)
显示电压值
&& 从上述测试结果分析,本设计直流数字电压表的测量分辨率和测量误差均能达到题目基本和发挥部分的要求。
5.2采样速率测试
A/D转换结束后,单片机输出一个信号驱动发光二极管闪烁,显示A/D转换速度。用脉冲计数器测得其转换速度大于10次/S,达到了题目要求,结果如表2
转换速度(次/S)
本系统采用三斜积分式A/D转换器将输入的直流电压ui转换成与ui成正比的时间间隔,在此期间用MEGA8单片机计数器对恒定频率的时钟脉冲计数,计数结束时,计数器记录的数字量正比于输入的模拟电压,从而实现模拟量到数字量的转换。
电路设计完成后,通过进行分辨率、测量误差以及转换速度测试,测试结果表明本设计达到了设计的基本和发挥部分的全部要求,并且具备自动校零和自动转换量程的功能。
我们从信号源输入0―2V连续调节的直流电压信号作为该系统的被测信号源,对A/D转换电路的分辨率和测量误差进行了测试。选取被测信号源的1mV、5mV、50mV、150mV、200mV、300mV、500mV、1V、1.5V、2V点作为测试电压,分别进行了测试,结果见表1:
电路设计完成后,通过进行分辨率、测量误差以及转换速度测试,测试结果表明本设计达到了设计的基本和发挥部分的全部要求,并且具备自动校零和自动转换量程的功能。
在设计过程中,因为使用普通器件,元器件较多,而且输入信号较弱容易受到干扰,所以力求硬件电路简单,努力从工艺上下功夫,并对某些电路进行创新。本系统达到了竞赛题目中的各项要求。同时,设计过程中遇到了许多困难,设计上还存在许多值得改进的地方。通过本次设计,我们深刻体会到共同协作和团队精神的重要性,提高了自己解决问题的能力。
[1]苏长赞主编:《实用遥控技术手册》,北京:人民邮电出版社,1996年。
[2]陈永甫主编:《红外探测与控制电路》,北京:人民邮电出版社,2004年。
[3]无线电爱好者丛书编委会,黄继昌等主编:《实用识别电路》,北京:&&&& 人民邮电出版社,2005年。
[4]华中理工电子学教研室编,康华光主编:《电子技术基础》(模拟部分)(第四版),北京:高等教育出版社,1999年。
[5]华中理工电子学教研室编,康华光主编:《电子技术基础》(数字部分)(第四版),北京:高等教育出版社,2000年。
[6]秦曾煌主编:《电工学》上册,电工技术(第五版),北京:高等教育出版社,1999年。
[7]秦曾煌主编:《电工学》下册,电子技术(第五版),北京:高等教育出版社,1999年。
[8]万福君.单片机微机原理系统设计与应用.中国科学技术大学出版社,2003.
[9]宏晶科技.STC89CS1RC-RD+-
GUIDE. http://www.stc-mcu.com.cn. 2005.
[10]基于Keil CS 1高级语言的TKS系列仿真器使用指南.广州致远电子有限公司,2004.
[11]袁希光.传感器技术手册.国防工业出版社,1986.
[12]强锡福.传感器.机械工业出版社,2000.
[13]徐爱均.Keil Cx51 V7.0单片机高级语言编程与u Vision2应用实践.电子工业出版社,2004.
[14]赖麒文.8051单片机C语言彻底应用.科学出版社,2002.
[15]周航慈.单片机应用程序设计技术.北京航空航天大学出版社,1991,
[16]马忠梅,籍顺心.单片机的C语言应用程序设计.北京航空航天大学出版社,1999.
[17]刘光斌,刘冬,姚志成.单片机系统实用抗干扰技术.人民邮电出版社,2003.
[18]张伟,王力,赵晶.Protel DXP入门与提高.人民邮电出版社,2003.
[19]阎石.数字电子技术基础.高等教育出版社,1998.
[20]《MCS-51系列单片机实用接口技术》作者:
& 出版社: && 出版日期:
[21]《流行单片机实用子程序及应用实例》&
作者: & 出版社:
出版日期:
[22]《51单片机教程》 EDA学习网()
附录一:整机原理图
附录二:元器件清单
直流基准电压产生电路元件清单
规格(型号)
运算放大器
精密运算放大器
100μF/16v
可调压稳压二极管
精密电位器
十圈线绕式
&三斜积分A/D转换电路元件清单
运算放大器
精密运算放大器
电压比较器
&&& 模拟开关
&&&&& 电容
&&&&& 电阻
电压比较器
单片机部分电路元件清单
显示电路元件清单
&&& 可调电阻
电源电路元件清单
附录三:部分源程序
#include &iom8v.h&
#include &macros.h&
#include "lcd.h"
#include &stdlib.h&
#include &math.h&
#include&string.h&
#define S0&& 1&&0&&&
#define S1&& 1&&1&&&
#define S2&& 1&&7&&&
//200mv&& PD7
#define S3&& 1&&2&&&
#define S4&& 1&&4&&&
#define S5&& 1&&3&&&
//discharge
#define S6&& 1&&5&&&
#define S7&& 1&&6&&&
//全局变量
unsigned char timetemp=0;
unsigned char time100ms=0;
unsigned int time500ms=0;
unsigned char stepflag=0;//转换阶段标志
-uref ? -uref/2 7?
unsigned char conflag=0; //正在转换标志
unsigned int& voltcount=0;& //ad值
float&&&&&&&&
volt=0;&&&&&& //电压值
unsigned char timeH=0;&&&& //计数器值
unsigned char timeL=0;
void init_devices(void);
void port_init(void);
void timer2_init(void);
void timer2_ovf_isr(void);
void timer1_init(void);
void timer1_ovf_isr(void);
void adadjust(void)
void adini(void);
void adconvert(unsigned char data);
void main()
&unsigned char lcdbuf[32];
&unsigned char *lcdp=
&init_devices();
&Inti_Disp();
&adadjust();
&& adini();
&& adconvert(0x08);//
&& set_cur(0);
&& lcdp=ftoa(volt,0);&&
&& putstr(lcdp);
&& set_cur(16);
&& ltoa(lcdbuf,voltcount,10);
&& putstr(lcdbuf);
void adini(void)
&&& PORDC=0x08; //放电30ms
&&& timetemp=30;
&&& conflag=1;&&&
void adconvert(unsigned char data)//充电
&&&&&& //充电196ms&&&
&&&&&& PORDC= //打开Ux
&&&&&& timetemp=196;
conflag=1;&&&
while(timetemp);//等待
&&&&&& //反向放电
//读取U0值&&&&&&&&&
if(PIND&0x08)
&&&&&&&&&&&
&&&&&&&&&&&&&
PORDC=0x10;//接入-uref/2 7
&&&&&&&&&&&&&
stepflag=1;//qi dong counter
&&& &&&&&&&&&&timeH=0;
&&&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&
&&&&&&&&&&
&& PORDC=0x04;//接入-uref
&&&&&&&&&&
&& stepflag=2; //qi dong counter
&&&&&&&&&&
&& timeH=0;
&&&&&&&&&&&&&&&
&&&&&&&&&&
dischar1:&
while(stepflag==2)
&&&&&&&&&&&
&&&&&&&&&&&
& if(PIND&0x08)
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&
& &&&&PORDC=0x10;//接入-uref/2 7
&&&&&&&&&&&&&&&&&&&
stepflag=1;//qi dong counter
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&&&&&&
while(PIND&0x04);
voltcount=timeH;
voltcount=(voltcout&&7)+timeL;
&&&&&&&&&&&&
void port_init(void)
&PORTB = 0xFF;
&PORTC = 0x08; //m103 output only
&DDRC& = 0
&PORTD = 0x7F;
&DDRD& = 0xf3;
//TIMER1 initialisation - prescale:64
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 500uSec
// actual value: 500.000uSec (0.0%)
void timer1_init(void)
&TCCR1B = 0x00; //stop
&TCNT1H = 0xFF; //setup
&TCNT1L = 0x83;
&OCR1AH = 0x00;
&OCR1AL = 0x7D;
&OCR1BH = 0x00;
&OCR1BL = 0x7D;
&ICR1H& = 0x00;
&ICR1L& = 0x7D;
&TCCR1A = 0x00;
&TCCR1B = 0x03; //start Timer
#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
&//TIMER1 has overflowed
&TCNT1H = 0xFF; //reload counter high value
&TCNT1L = 0x83; //reload counter low value
&if(stepflag==1)
&&& && //timeH
&&& && timeL++;
&if(stepflag==2)
&&&& timeH++;
//TIMER2 initialisation - prescale:64
// WGM: Normal
// desired value: 1mSec
// actual value:& 1.000mSec (0.0%)
void timer2_init(void)
&TCCR2 = 0x00; //stop
&ASSR& = 0x00; //set async mode
&TCNT2 = 0x06; //setup
&OCR2& = 0xFA;
&TCCR2 = 0x04; //start
#pragma interrupt_handler timer2_ovf_isr:5
void timer2_ovf_isr(void)
&TCNT2 = 0x06; //reload counter value
&if(timetemp!=0)
&& timetemp--;
&& conflag=0;&
&if(time500ms==0)
&&&& PORTC^=0x20; &&
&&&& time500ms=500;
&time500ms--;
//call this routine to initialise all peripherals
void init_devices(void)
&//stop errant interrupts until set up
&CLI(); //disable all interrupts
&port_init();
& timer1_init();
&timer2_init();
&MCUCR = 0x00;
&GICR& = 0x00;
&TIMSK = 0x44; //timer interrupt sources
&SEI(); //re-enable interrupts
&//all peripherals are now initialised
(责任编辑:admin)
------分隔线----------------------------}

我要回帖

更多关于 试用期目标设定 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信