你是电子爱好者吗?然后一个可调电源是您各种需要的必需品。这个项目的解释如何制作基于LM317的带数字显示的可调电源单元。对于本项目读者应具备的知识如何开始与AVR和接口液晶与AVR.
组件的要求
1.LM317集成电路
2.电阻器- 240欧姆
3.电容器- 0.1uf,10uf
4.电位计- 5 k
5.30V/1A适配器(或变压器+桥式整流IC)
6.ATMega16发展委员会
7.16 x 2 lcd显示
7.16 x 2液晶显示板
电路设计
电源电路非常简单,可以在LM317的数据表中找到。
图1:基于LM317 IC的可变电源电路图
输出电压由公式给出,
Vout = 1.25 (1+ R2/R1) + Iadj x R2
但问题是ATmega16只能承受5V的电压。输入电压超过该电压会烧坏控制器。
解决方案:一个分压器电路!
图2:功率输出分压电路电路图
R1和R2是电阻和V在为输入电压。输出电压V出给出:
V出= V在X r2 /(r1 + r2). . . . . . . . . . . . . . .(1)
我们根据自己的要求选择电阻器的值。比如,现在我们要测量的最大电压是30V,但我们只能给我们的控制器5V。
这里最大Vin = 30V最大Vout = 5V
代入方程(1)求解,得到
R1:R2 = 5:1
所以我们可以采取r1 = 5kohm和r2 = 1k欧姆
代码的解释
—初始化控制器的16位ADC模式。
- 初始化LCD函数。
- 输入无限循环。
-读取ADC1上的电压电平,将其转换为16位离散值(0到1023),并将其存储在变量“val”中。
—“val”的值除以1024,然后乘以30。这给你原始施加的电压值。
- 现在在LCD中显示此值。
转换过程的例子
•假设我们给系统施加一个输入电压Vin= 24V
•现在从设计方程可以计算出分压器电路的输出电压。这里的输出是4V,这是微控制器ADC引脚的输入。
•控制器将模拟值(0-5V)转换为范围0-1023的离散值。在本例中,该值大约为819。
•接下来,这个离散值通过编程再次转换为原来的输入电压范围0-30V。这里得到的值是23.99,几乎等于24V!
图3:基于AVR ATMEGA16的可变电源的框图
我们如何显示小数:
假设我们得到一个值val = 24.93
现在" lcd_write_int() "函数只接受整数,不接受小数部分。
所以我们要做的是,
第一步:val乘以100
Val x 100 = 24.93 x 100 = 2493(假设我们将其命名为' a ')
步骤2:使用' / '运算符获取整型部分
i = a / 100 = 2493/100 = 24(整数)
步骤3:使用' % '运算符获取小数部分作为另一个整数
D = a % 100 = 2493 % 100 = 93
步骤4:
首先显示整数部分,后跟'。'然后是十进制部分。
例如:display(I+ ' . ' +D) à id
图4:基于AVR ATMega16的可调电源显示面板的代表性图像
项目源代码
###LCD.H#ifndef LCD_H_ #define LCD_H_ #define rs PA7 #define rw PA6 #define en PA4 void lcd_init();空白dis_cmd (char);空白dis_data (char);空白lcdcmd (char);空白lcddata (char);空白clrscr ();空白gotoxy(字符,字符);void LCD_write_string(const char *);空白lcd_write_int (unsigned int, int);#endif Variable.C /* * Variable.C * * Created: 5/29/2014 3:53:39 PM * Author: GANESH SELVARAJ */ #define F_CPU 16000000UL #include#include #include "lcd.h" void SetADC() {ADMUX|=(1< //延迟50毫秒SetADC();lcd_init ();LCD_write_string (Adj供电);而(1){gotoxy (1,1);电压LCD_write_string(“:”);v = ((ReadADC (0) / 1024.00) * 3000.00);lcd_write_int ((v / 100), 2);dis_data('。');lcd_write_int ((v % 100), 2);dis_data (' V '); dis_data(' '); Waiting(2); } } LCD.H /* * EG_LCD.c * * Created: 2/9/2014 10:49:54 PM * Author: stranger */ #include #include #include #include "lcd.h" void LCD_write_string(const char *str)//在指针中存储字符串的地址值*str {int i=0;而(str[我]! = '//循环将继续到字符串中的NULL字符{if (str[i]=='*') {i++;int8_t cc = str[我],' 0 ';If (cc>=0 && cc<=7) {dis_data(cc);} else {dis_data('%');[我]dis_data (str);}} else dis_data(str[i]);//按字节i ++在LCD字节上发送数据;} 返回;void lcd_init()//函数初始化{DDRB=0xFF;dis_cmd (0 x02);//初始化LCD在4位模式。dis_cmd (0 x28);//初始化LCD在2行,5X7点和4位模式。dis_cmd (0 x0c);dis_cmd (0 x06);dis_cmd (0 x0e);gotoxy (0,0);} void dis_cmd(char cmd_value) {char cmd_value1;cmd_value1 = (((cmd_value>>4) & 0x0F);//移动4位掩码lcdcmd(cmd_value1);//发送到LCD cmd_value1 = cmd_value & 0x0F;//掩模下啃,因为使用了PA4-PA7引脚。lcdcmd(cmd_value1);//发送到LCD} void dis_data(char data_value) {char data_value1;data_value1 = ((data_value > > 4) &0x0F);lcddata (data_value1);data_value1 = data_value&0x0F;lcddata (data_value1);} void lcdcmd(char cmdout) {PORTB=cmdout;PORTB& = ~ (1 < < rs);PORTB& = ~ (1 < < rw);PORTB | = (1 < < en);_delay_ms (1); PORTB&=~(1< ###
电路图
了下:188金宝搏提款有问题吗