|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
数控电源,上电初始电压是3V8 e* b& R. r# s% b) C1 k# l' w
//采用atmega8芯片做的,四位数码管显示电压值,调节范围是1.8V到12V之间
2 c5 R2 a v) C. ^ //采用开关稳压芯片LM2576ADJ做的降压,效率高达77%,电流最大3A,误差电压为正负0.2V
: ?$ t. l9 a7 ^0 f* q- t* ] #include<avr/io.h>
" Q$ F) P8 a/ [( O- G% b #include<avr/interrupt.h>
9 a: Q) g; [, ^& n #define uchar unsigned char, L" r: {: j L$ x9 X0 u& z
#define uint unsigned int
' K! S8 G. ?. f; E* m #define duan PORTD8 Y6 m3 d: R0 d2 v7 J3 {# x [) S, y
uchar const tab[]={ 0xC0,/*0*/+ J5 s1 Z0 V5 {' E
0xF9,/*1*/( H( q) B; ]" m
0xA4,/*2*/
3 z Y9 y. ~3 B( B 0xB0,/*3*/
: \# @2 b! K4 C2 l8 Q0 Z 0x99,/*4*/
4 P0 S4 T( T2 i y3 X* M 0x92,/*5*/
& F4 o+ t0 v, i1 r* `8 g2 n, C 0x82,/*6*/& J% w! m* t& U% }" {2 t" v, U
0xF8,/*7*/( \& H$ r0 L" [
0x80,/*8*/) N; y- w# C( s/ D" N
0x90,/*9*/
$ V V! [9 d" i' x* \5 j2 v: s };
d5 I: w/ M' Z, f7 @6 g& K# v r uint DY=30; //30就是为3.0V电压,用于设定电压
( c2 v+ m7 J, }% y4 z1 q uint AD_shu,tiao_shu; //一个用于保存ADC转换后的数,一个用于运算比较0 Q/ p2 z8 R$ M6 ?; l1 Q6 }) z, _, q: V
void delay(uint k)2 b: E/ o+ N ?0 S
{: N* n$ Y4 {9 p/ j
for(;k>0;k--);
4 k/ R! g+ F g1 o4 a% w }
4 h7 w! p# p; ]$ w! ~! g' k& s void init()! ]$ H" a4 P7 _
{
. z4 e1 M; k' P4 U3 I DDRD=0xff; //D端口全为输出: C9 q. T; ?7 a, j+ b( e) w
PORTD=0;+ f! \5 G7 g' L
DDRC=0xfc; //C端口低两位用于ADC,高四位用于数码管位选
- i; e! _* b8 g4 f- |- \* `, U9 J PORTC=0x0; //C端口输出全0
& S+ ^# t2 x" R: A DDRB=0x07; //定义PB口的低三位为输出,PB1为PWM输出信号
6 q7 u. {2 _+ S5 @7 D4 D$ e* ~ PORTB=0xf8; //低三位输出0,高五位加上拉电阻
3 u% w- B& u' w( \; Q) k, y TCCR1A=0X63; //设置PWM比较匹配器& \1 B; u8 }" _0 p. _
TCCR1B=0X13; //设置PWM比较匹配器
, W& K9 G1 N5 C" f: R OCR1A=250; //装PWM寄存器的高位比较值) r6 }$ k; x; U" r# s9 W; L" v
OCR1B=10; //装PWM寄存器的低位比较值,开启后自加,达到高位时,PB1端口取反
" O/ V6 a+ A% @8 M ADMUX=0xc0; //ADC选通道0,并且用内部的2.56V参考电压,数据右对齐
4 ^% e8 f$ Z5 ^9 A( S% t- `9 Z5 q ADCSRA=0xac; //ADC是连续转换,并且16分频,并且开了中断
2 t# o) Q3 x0 ]7 ` }
6 M0 J: r0 Y7 {7 K8 q0 g. q void desplay(uint dian_ya)
6 l( B+ H. [$ s- Q( d, o {- a6 S0 t9 B; ?/ H# L0 `) t6 r
duan=tab[dian_ya/100]; //显示十位电压& j4 i4 r1 X$ K( [8 d
PORTB|=0x04; //pc2为位选
1 O4 [8 a/ C: x3 `, I O J delay(400);
* B4 j- I$ R# N5 `/ i PORTB&=0xfb;, `# }* v* S6 v. `3 s
duan=tab[dian_ya%100/10]&0x7f; //显示个位电压,并点亮小数点- Q- j- M; e3 L: g. F
PORTB|=0x08; //PC3为位选# w* h: ~9 p% f2 K
delay(400);
- u# n5 [0 K8 u' K8 U PORTB&=0xf7;
9 p* O8 u9 f( ^1 f; t% E duan=tab[dian_ya%10]|0x80; //显示小数位电压,并灭小数点: x- a* H9 w# y! M$ m* q
PORTB|0x10; //PC4为位选
( e0 o, D7 p! ?* B delay(400);7 C9 r8 f; x8 \
PORTB&=0xef;! o/ x$ O# B) j% m9 q
duan=tab[11]; //用于设定时点亮
5 B( ~5 z2 X; W PORTB|=0x20; //PB5为位选
0 K. { T0 G/ s+ a# ]( H) K delay(400);) q. ?# a$ Y) s
PORTB&=0xdf;
. X/ {% o# ~7 J: I0 q }$ Y% x+ c1 f$ u' l. n! \3 {
void key()
. r5 p0 |% @9 W {: O& W# |. J8 ]4 z1 N, O9 C$ I% R2 e
IF(!(PINB&0x08)) //PB3为加电压按键2 H) R6 H3 u. Q* f$ P( X
{; Q6 D* c+ k3 `' ^
delay(5000);! R" I7 N8 C7 x' z
if(!(PINB&0x08))! `* I4 m! j! ]- ^
{
& a/ H% V) R s; [& n3 ^# M DY++;0 X8 A6 w7 O/ Q6 Y* @6 H
if(DY>120)DY=120;( f" T1 l, E$ ]5 p. f3 J6 q: \
}# B- b6 o5 J: A- S. O" g- z
}& ~$ ?2 r3 R. W' Y# F1 n5 `6 x
if(!(PINB&0x10)) //PB4为减电压按键% U+ K Z6 R$ T$ K
{: q. @8 L9 h1 h/ e& N- J
delay(5000);
) A% Z6 C3 q( N5 f if(!(PINB&0x10))% `' U3 @) ~4 t' z8 d5 F# I! C3 H
{" e6 F; j6 R% e' c3 ^1 d
DY--;
3 I4 T" H# \& n& U' b$ i( B if(DY<18)DY=18;: [4 G V& n( E- v: |0 D
}$ @# a/ }" j* B4 Q
}
2 l J2 S" k9 c: R; t6 C }
# w4 j) L+ N& R# p int main()0 @8 @( B' d9 O0 Y/ f$ C$ h
{
s- a- y2 E$ v3 v uchar i=1;) R. g; d9 l% c! N0 E% S
init();
5 _0 u6 [% K3 I ADCSRA|=0x40; //开始ADC转换1 f! Q* q& K- j2 A
while(1)
( P$ Q* q- u+ R( W* [" t {
* c! U: H0 D7 r8 H m key();( K" n _) i% i3 V- b
tiao_shu=(uint)(((float)AD_shu)/8.5); //计算ADC采样后的数进行电阻分压后的实际数据转换补常4 ^6 N- t* m J5 `
if(tiao_shu>(DY+2)) i--; //如果采样转换后数值大于设定值,就减小PWM脉宽(设定值加2是电压误差值)
% V, G- D# ^ _# r8 C/ D if(tiao_shu<(DY-2)) i++; //如果采样转换后数值小于设定值,就加大PWM脉宽(设定值减2是电压误差值)9 v0 w7 H, o( O3 T$ P! h
delay(20); //延时
5 o9 F: I0 Q4 o! T8 e1 J% w OCR1B=i; //装入PWM寄存器# b; w) T" N+ F9 ~' G
desplay(DY);
. c' p( |& d) o$ B- N# a }% i4 c% J" X( t; y3 q7 F! l
}
! l* ^2 b& X8 S. }/ S: i) I SIGNAL(SIG_ADC)# f2 L4 q5 P' H- V& w
{
- ^& \& |, c- F AD_shu=ADCL;0 a# B2 I" v k2 A
AD_shu|=(uint)(ADCH<<8);9 b! ]; d7 x* a B" p( w( n. T f
}# Q+ w* Z* S2 C1 \
- x5 X9 I; o0 g9 ]
/ `" w- [4 V+ `: e, u. M8 F2 I |
|