|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
数控电源,上电初始电压是3V$ a2 b* \* x7 }3 o- ^/ b
//采用atmega8芯片做的,四位数码管显示电压值,调节范围是1.8V到12V之间
! @; c3 s6 @1 Q& F; u/ S+ z7 M9 | //采用开关稳压芯片LM2576ADJ做的降压,效率高达77%,电流最大3A,误差电压为正负0.2V
% j4 b8 d2 |" v y #include<avr/io.h>4 p0 V2 w; B' y
#include<avr/interrupt.h>
5 A5 ~* F$ |0 r #define uchar unsigned char
6 l. h: r: E; K( f v% I- d/ L #define uint unsigned int+ W( ~8 J; e L5 L4 x% |7 S% C2 G
#define duan PORTD/ J5 h$ S' L1 _
uchar const tab[]={ 0xC0,/*0*/
1 q6 ? A& C" P; w% U& S* N7 g' B 0xF9,/*1*/
/ r$ l, H+ r1 z$ } 0xA4,/*2*/) F- e9 z7 R D# m5 h' Y( W" B
0xB0,/*3*/( T% g, Z: `" F5 R) o3 A# k
0x99,/*4*/
' m5 q, W# O7 X! X5 J 0x92,/*5*/
$ _9 r' \9 `' E ~& [ 0x82,/*6*/
7 W2 h5 [# u5 P. d1 C% t2 u 0xF8,/*7*/
; j7 n1 H7 s! {, g' Z 0x80,/*8*/
" h/ n( u3 O0 M* X5 q8 A 0x90,/*9*/! |1 v# j1 O! n; n6 H; e
};$ Z5 q! Z; n$ H, a3 F, H4 Y6 \
uint DY=30; //30就是为3.0V电压,用于设定电压
& l& p: T2 Y+ ?% S# Q" P uint AD_shu,tiao_shu; //一个用于保存ADC转换后的数,一个用于运算比较
7 y& V: a6 E- j, m y void delay(uint k)7 h7 y( m+ T& K5 a1 T( O5 R) H S* p
{
0 N: W$ f) [% N: ^; { for(;k>0;k--);
2 p B& d7 W, j7 s2 z6 h }# `+ E# {: ?: H; z; G* _) ?
void init()8 |/ l% P2 u2 V6 }8 f6 v
{. ~5 O+ S5 ]7 F- N
DDRD=0xff; //D端口全为输出
" }1 z. `+ Y; w PORTD=0; i `6 {) K, y/ C* a
DDRC=0xfc; //C端口低两位用于ADC,高四位用于数码管位选# ?9 c2 T& L) d
PORTC=0x0; //C端口输出全0" F7 V1 ~, \5 t; t( J! I& y
DDRB=0x07; //定义PB口的低三位为输出,PB1为PWM输出信号& u+ _7 K3 q" I% k; ?: k A1 c* W
PORTB=0xf8; //低三位输出0,高五位加上拉电阻; P+ K7 N' V& P9 \0 V# D1 c. p
TCCR1A=0X63; //设置PWM比较匹配器; z4 Q; q4 Q- |3 \) e) \
TCCR1B=0X13; //设置PWM比较匹配器& h! x0 o5 }. x/ O6 p
OCR1A=250; //装PWM寄存器的高位比较值+ x! p! K6 ?- U$ ^% P8 F* d! j. V
OCR1B=10; //装PWM寄存器的低位比较值,开启后自加,达到高位时,PB1端口取反
\. H; ]! R G* H* B ADMUX=0xc0; //ADC选通道0,并且用内部的2.56V参考电压,数据右对齐0 b' f( E2 ]: x2 x8 \* i1 W
ADCSRA=0xac; //ADC是连续转换,并且16分频,并且开了中断
' x2 z0 |6 ~ p' R. v8 X3 b }
; r9 y$ d; X6 f$ Z4 \ void desplay(uint dian_ya)' G$ m/ i& A/ i& s- f3 [" {
{4 {/ q$ d9 n p5 X1 A) r+ M B
duan=tab[dian_ya/100]; //显示十位电压 M0 A ]' p$ y# L, @5 g
PORTB|=0x04; //pc2为位选
, L. Q5 R5 W0 m% B9 O6 I' J delay(400);9 `8 Z8 U; @% N
PORTB&=0xfb;
% r- w8 r' r7 ], I& Z0 L* t duan=tab[dian_ya%100/10]&0x7f; //显示个位电压,并点亮小数点
: @5 t3 b- o* e, C PORTB|=0x08; //PC3为位选
' w7 u, U4 ?- b delay(400);; @- s; \, o/ Z, R5 D# i7 _1 L
PORTB&=0xf7;
3 r" F, i2 D5 A+ l# w( R duan=tab[dian_ya%10]|0x80; //显示小数位电压,并灭小数点
6 i7 e* V! A7 j4 z9 U! ~6 G( e PORTB|0x10; //PC4为位选
, n I) s# V! E0 Z delay(400);
7 [1 n0 y1 t" C' P- i! Z' n PORTB&=0xef; l; G4 h, {) e& I% z& w. x# ^
duan=tab[11]; //用于设定时点亮
9 Y- v' d, l* W- n PORTB|=0x20; //PB5为位选+ u- ^" y( E! V1 e: V* W; m
delay(400);7 @: `: D+ ^& R$ c
PORTB&=0xdf;
2 _; K- i) S% k) j }
, S2 U; |4 ~6 r+ E void key()
* i {& P$ a) b1 l6 a( t" y {" c, z0 w; \) X# _) Q$ [$ ^% m* H
IF(!(PINB&0x08)) //PB3为加电压按键
4 U2 c% @- Q+ y {
& L! h T [) n& l+ @1 s) u1 V delay(5000); V+ T2 j7 `6 D
if(!(PINB&0x08)); O5 j) z/ v0 O6 k4 C- `, g
{
) Z) |) H o( J4 L9 b DY++;
5 o) R; }7 n$ V& J: z- \ if(DY>120)DY=120;& O7 Y* X9 D0 W7 U0 F+ m
}
0 O. A! m% \+ D4 a( b, ? }9 ^; H% e) [* e; W
if(!(PINB&0x10)) //PB4为减电压按键
% M9 U" _/ d) V j. u( `4 o {* Y* a9 I1 g6 q+ [
delay(5000);
8 Q- h6 \+ v3 ~8 y6 R6 X5 U if(!(PINB&0x10))! |4 x2 L% B) j
{
! c/ @& ~, }5 a5 F+ c( a) x/ V DY--;/ b, x$ K4 y9 |6 V7 S
if(DY<18)DY=18;
5 A2 J5 @* m7 @' [% O }
+ ^2 n* c/ ]) j/ [( W* z+ F }
( \2 n, q: O) y4 B0 t }
7 F# Y$ M! M0 C6 k0 ?/ s; v int main()) z2 e" S; ^$ a0 ^2 [+ R {
{, k& v( k0 A9 J+ |) D! i) D
uchar i=1;
9 M2 y1 i$ t1 D9 P: X init();$ @1 V: e i7 {& z
ADCSRA|=0x40; //开始ADC转换: Y* ~+ x h1 t q. a* Z+ c, S
while(1)9 w1 {- E7 V. `: {: S7 U
{
+ e2 p, ~/ w" L; x key();
+ _" M7 H+ s7 R- u tiao_shu=(uint)(((float)AD_shu)/8.5); //计算ADC采样后的数进行电阻分压后的实际数据转换补常. z; O p& b0 A& s; ?4 H
if(tiao_shu>(DY+2)) i--; //如果采样转换后数值大于设定值,就减小PWM脉宽(设定值加2是电压误差值)
, i3 i3 v" k" c8 Z' x0 y8 d/ E if(tiao_shu<(DY-2)) i++; //如果采样转换后数值小于设定值,就加大PWM脉宽(设定值减2是电压误差值)8 t! G$ E! K& f. W) F/ p% o' W1 }
delay(20); //延时
1 d, _* [6 l6 x$ ?% Y OCR1B=i; //装入PWM寄存器8 D7 j4 V j% g# V) O
desplay(DY);% k' S% d0 q( K
}3 o% ]1 A1 b% X0 V8 z) L
}" i2 \) X$ d+ i" P' W! \
SIGNAL(SIG_ADC): d# M8 g5 }( \/ x) L0 m
{
- }: o; x, ]3 Z: Q. q9 u# m6 Q* ? AD_shu=ADCL;
; {' o) Y1 @- y AD_shu|=(uint)(ADCH<<8);9 @4 f& ]& j8 n4 V- g4 X& B
}) \* M* @$ s4 v k
* {8 ?2 G1 A N+ \' w# b
; u5 n' A/ W$ ^: k1 l
|
|