|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
数控电源,上电初始电压是3V
; d' D# B( G5 S2 m //采用atmega8芯片做的,四位数码管显示电压值,调节范围是1.8V到12V之间
" v, a7 J% |" V7 h //采用开关稳压芯片LM2576ADJ做的降压,效率高达77%,电流最大3A,误差电压为正负0.2V* m- h2 D, V% T3 u
#include<avr/io.h>
2 ^1 ?* w" E2 k6 _: h #include<avr/interrupt.h>: w6 _2 Y% A' a; i& L$ \7 ]
#define uchar unsigned char/ y0 D( y1 c7 _. K% w
#define uint unsigned int d x" O- F; g9 e
#define duan PORTD
+ ~% a' q* t: R" @9 Q) u1 O uchar const tab[]={ 0xC0,/*0*/
A2 d5 X8 p7 t5 Q2 O 0xF9,/*1*/
+ C+ t5 r) o/ J 0xA4,/*2*/
5 S! V& V7 |# j1 M6 E! ]. B$ v 0xB0,/*3*/2 S c" y% X& j1 n. t
0x99,/*4*/
7 Z- X- ^1 t( B! |- W3 C: x. h: E 0x92,/*5*/7 `. M( a A' j2 o. A4 W1 s9 d
0x82,/*6*/
5 t$ z' \& H7 ]0 v4 i 0xF8,/*7*/
* ^# Q* h- s9 }8 Y( F. S2 ~ 0x80,/*8*/# v/ {/ V% ]/ y O" z0 E: Y
0x90,/*9*/
) ?: h6 S. H( e* ` };
- _: a; p; d/ |, A: s, {4 d uint DY=30; //30就是为3.0V电压,用于设定电压
. c! ?- E) f9 b uint AD_shu,tiao_shu; //一个用于保存ADC转换后的数,一个用于运算比较' \0 J4 |; m+ B; D/ X. I3 k9 }
void delay(uint k) Q3 d$ z+ ?) h& r% |
{/ T. i# u; Y+ i0 d
for(;k>0;k--);( k) b; h1 f' g/ R% ?. w) F
}1 h4 ?$ d7 p# b3 }% ?# y! ]' v* ~ V d
void init()1 D% `" F2 E) {6 \ m' Z1 G3 v
{
, U1 f6 [) W( @4 \2 R DDRD=0xff; //D端口全为输出/ r3 m) w& N9 M) e7 m1 B. _
PORTD=0;5 d1 m0 e% l! C; d0 o2 B
DDRC=0xfc; //C端口低两位用于ADC,高四位用于数码管位选3 x! Y. e: }2 y4 _
PORTC=0x0; //C端口输出全0
4 M; w! o) N5 t& K$ E DDRB=0x07; //定义PB口的低三位为输出,PB1为PWM输出信号
6 E T; B* h( \. |7 I' M PORTB=0xf8; //低三位输出0,高五位加上拉电阻
# U) {3 c+ K6 K0 A- h! i0 y ^ TCCR1A=0X63; //设置PWM比较匹配器; u7 q8 j3 E& q
TCCR1B=0X13; //设置PWM比较匹配器
7 G3 ]; K1 J" }8 y8 Y OCR1A=250; //装PWM寄存器的高位比较值& U$ H; z1 O& T% X
OCR1B=10; //装PWM寄存器的低位比较值,开启后自加,达到高位时,PB1端口取反4 i7 H! R' r( G1 h
ADMUX=0xc0; //ADC选通道0,并且用内部的2.56V参考电压,数据右对齐$ v3 H' h( d, d# K
ADCSRA=0xac; //ADC是连续转换,并且16分频,并且开了中断! `; W( l9 c/ [& |7 ~
}, d% o- V, O) r8 z. a4 u
void desplay(uint dian_ya)0 N: S' H P& g& f' t* T _2 Y) I
{( l8 j0 p0 q- ?7 n3 O
duan=tab[dian_ya/100]; //显示十位电压
) V$ Y" ^/ f$ e1 E( B0 D1 ] PORTB|=0x04; //pc2为位选& C7 B% T9 H/ [& S0 G
delay(400);
6 l* f0 [/ T+ ^% M PORTB&=0xfb;
+ I& x: z: i, ?) E1 o duan=tab[dian_ya%100/10]&0x7f; //显示个位电压,并点亮小数点+ b; ?& c! T' h" M4 a
PORTB|=0x08; //PC3为位选* N- D, s4 D) S
delay(400);4 ?' i+ G$ F% ]) A0 I, }; |4 O
PORTB&=0xf7;
( f% G( I, {$ ]0 A; Z duan=tab[dian_ya%10]|0x80; //显示小数位电压,并灭小数点6 n4 f: [7 y5 j8 i `1 \& O! }
PORTB|0x10; //PC4为位选7 y( k% H- F0 d) B9 C
delay(400);/ k2 W. Q" N P# x2 o" Y) y4 D
PORTB&=0xef;" R+ W: I0 R' U' ]% c. w, c9 t& s
duan=tab[11]; //用于设定时点亮
) t1 \" }9 \% M" u! c6 o PORTB|=0x20; //PB5为位选
& P% u0 O0 U( H7 y delay(400);! @! v9 k( o) n! {0 V" w z/ F
PORTB&=0xdf;3 e; o' m. w! ~6 n% }
}
) V8 ^0 N1 b4 B6 `0 `& U e- Y void key()
3 s7 D2 o z/ u" C {
0 A$ }: g2 c6 h D- ?0 V IF(!(PINB&0x08)) //PB3为加电压按键" e. E: V" H3 P+ ?' ^
{
( u8 S: ]# W+ E' l- P delay(5000);5 w( T3 [, N0 _# R- S% S) h
if(!(PINB&0x08))
4 R7 i& N! N0 p( g- ]( i& D" Q {
7 v& \. O, o: k( Z3 v0 C: D5 N DY++;7 o4 e* s) }4 t v
if(DY>120)DY=120;) i. [4 [( e6 O
}
$ e% w4 Z3 T# C7 U1 Y2 K }
. R0 M6 n2 L0 o u6 \ if(!(PINB&0x10)) //PB4为减电压按键
p8 X% A/ U9 ^ {# \ t3 K1 O9 Q: `1 U; Z7 ~
delay(5000);7 O$ G# @" M% ?0 A s. [
if(!(PINB&0x10))) y. m6 }" x: v( f; }3 N1 z3 D
{
5 u- K& Z9 r" q1 R1 v- N DY--;0 x: m# V8 i/ X$ _0 U
if(DY<18)DY=18;
( h) g# c+ b1 X0 Z }
0 X2 X) M8 J4 O" o/ l0 R% N }
5 c" ^" G9 x s, l" p" { }
$ c4 c& h5 y) Y: ]' V; c int main()3 {; W) X/ k" L5 T5 ?$ r
{* J5 p# ^5 Q" @2 v8 l$ E
uchar i=1;
# ^$ t( n; O: M9 k6 q: K4 c9 e init();1 Q* Z7 L" f: K: A6 q& G
ADCSRA|=0x40; //开始ADC转换
* Y6 S. d: ^" ?8 {6 Q while(1)0 Q7 Z5 }. d9 d/ |. O
{
( x3 U+ a! ~4 O key();
! A+ H! M+ Q3 L! Z" { h) A6 W tiao_shu=(uint)(((float)AD_shu)/8.5); //计算ADC采样后的数进行电阻分压后的实际数据转换补常
3 e/ n* |. [! Y0 ^% x if(tiao_shu>(DY+2)) i--; //如果采样转换后数值大于设定值,就减小PWM脉宽(设定值加2是电压误差值)3 s0 G' r+ {6 v6 G2 O7 h& x; B
if(tiao_shu<(DY-2)) i++; //如果采样转换后数值小于设定值,就加大PWM脉宽(设定值减2是电压误差值)
3 Y- @8 [$ p# G9 W, t+ ^# b delay(20); //延时
1 v5 r% q' z$ v OCR1B=i; //装入PWM寄存器
# H: |, T/ M" r0 x* I7 K desplay(DY);
( \/ |8 Q3 t9 R; u5 x: Y }
/ ^* s9 F! f$ C3 ?3 m! X5 b! g }
; m I& N/ t+ u SIGNAL(SIG_ADC)# t9 O2 E. R! N+ `0 v
{9 O! W5 f/ C! [. k8 H& B5 h d
AD_shu=ADCL;0 T' s% I/ b% e6 R
AD_shu|=(uint)(ADCH<<8);. X: a5 w \: l, y/ a+ }
}) |1 m5 m. o3 N
, n* Y2 H$ X& L0 b8 D7 J( ^ 7 T% t% A2 M, A& M) |
|
|