找回密码
 注册
关于网站域名变更的通知
查看: 236|回复: 2
打印 上一主题 下一主题

开关稳压芯片LM2576ADJ做数控电源程序

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-8-4 11:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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) |

该用户从未签到

2#
发表于 2022-8-4 13:05 | 只看该作者
感谢,这东西好啊!!!

该用户从未签到

3#
发表于 2022-8-4 15:51 | 只看该作者
好东西,学习学习!谢谢分享!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-8 14:17 , Processed in 0.140625 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表