在这个项目中,我们将设计一个用于测量温度的电路。该电路是使用线性电压传感器“ LM35 ”开发的。温度通常以“摄氏度”或“方沸石”测量。“ LM35”传感器根据摄氏刻度提供输出。
LM35是类似于三引脚晶体管的器件。它具有VCC,GND和OUTPUT。该传感器根据温度在输出端提供可变电压。
如上图所示,温度每升高+1摄氏度,输出就会增加+ 10mV。因此,如果温度为0℃,传感器的输出将为0V,如果温度为10℃,传感器的输出将为+ 100mV,如果温度为25℃,传感器的输出将为+ 250mV。
因此,到目前为止,使用LM35,我们可以得到可变电压形式的温度。随温度变化的电压作为ATMEGA32A的ADC(模数转换器)的输入。转换后获得的数字值在16x2 LCD中显示为温度。
所需组件
硬件: ATMEGA32微处理器,电源(5v),AVR-ISP编程器,JHD_162ALCD(16x2LCD),100uF电容器(两个),100nF电容器,LM35温度传感器。
软体: Atmel studio 6.1,progisp或flash magic。
电路图和说明
在该电路中,ATMEGA32的PORTB连接到LCD的数据端口。如果要使用PORTC作为普通通信端口,则应记住通过更改熔丝字节来禁用PORTC或ATMEGA中的JTAG通信。在16x2 LCD中,如果有背光,则全部有16个引脚,如果没有背光,则有14个引脚。一个人可以给背光灯供电或离开。现在,在14个引脚中,有8个数据引脚(7-14或D0-D7),2个电源引脚(1&2或VSS&VDD或gnd&+ 5v),第三个用于对比度控制的引脚(VEE控制字符的粗细) 3个控制引脚(RS&RW&E)。
在电路中,您可以观察到我只接了两个控制引脚,因为这样可以更好地理解。对比度位和READ / WRITE不经常使用,因此它们可以接地。这使LCD处于最高对比度和读取模式。我们只需要控制ENABLE和RS引脚即可相应地发送字符和数据。
LCD的连接如下所示:
PIN1或VSS ------------------接地
PIN2或VDD或VCC ------------ + 5v电源
PIN3或VEE ---------------地面(为初学者提供最大的对比度)
PIN4或RS(寄存器选择)--uC的PD6
PIN5或RW(读/写)-----------------接地(将LCD置于读取模式可简化用户的通信)
PIN6或E(启用)--uC的PD5
PIN7或D0--uC的PB0
uC的PIN8或D1 ----------------------------- PB1
uC的PIN9或D2 ----------------------------- PB2
uC的PIN10或D3 ----------------------------- PB3
uC的PIN11或D4 ----------------------------- PB4
uC的PIN12或D5 ----------------------------- PB5
uC的PIN13或D6 ----------------------------- PB6
PIN14或D7 ---- uC的PB7
在电路中,您可以看到我们使用了8位通信(D0-D7),但这不是强制性的,我们可以使用4位通信(D4-D7),但是4位通信程序变得有点复杂,因此我选择了8位通讯。
因此,仅从上表中观察,我们就将LCD的10针连接到控制器,其中8针为数据针,而2针为控制针。传感器提供的电压输出不是完全线性的。会很吵。为了滤除噪声,需要在传感器的输出端放置一个电容器,如图所示。
在继续之前,我们需要谈谈ATMEGA32A的ADC。在ATMEGA32A中,我们可以为PORTA的八个通道中的任何一个提供模拟输入,因为选择的是相同的通道并不重要。我们将选择PORTA的通道0或PIN0。在ATMEGA32A中,ADC的分辨率为10位,因此控制器可以检测到Vref / 2 ^ 10的最小变化,因此,如果参考电压为5V,则每5/2 ^ 10 = 5mV,我们得到一个数字输出增量。因此,对于输入中的每5mV增量,数字输出中的增量为1。
现在,我们需要根据以下术语设置ADC的寄存器:
1.首先,我们需要在ADC中启用ADC功能。
2.由于我们正在测量室温,因此我们实际上不需要超过100度的值(LM35的1000mV输出)。因此我们可以将ADC的最大值或基准设置为2.5V。
3.控制器具有触发转换功能,这意味着ADC转换仅在外部触发之后发生,因为我们不希望需要将ADC的寄存器设置为在连续自由运行模式下运行。
4.对于任何ADC,转换频率(模拟值到数字值)和数字输出的精度成反比。因此,为了获得更好的数字输出精度,我们必须选择较小的频率。对于较小的ADC时钟,我们将ADC的预售设置为最大值(128)。由于我们使用的是1MHZ的内部时钟,因此ADC的时钟为(1000000/128)。
这是我们开始使用ADC所需了解的仅有的四件事。以上所有四个功能均由两个寄存器设置。
红色(ADEN):必须将该位置1以启用ATMEGA的ADC功能。
BLUE(REFS1,REFS0):这两位用于设置参考电压(或我们将要提供的最大输入电压)。由于我们希望参考电压为2.56V,因此应通过表设置REFS0和REFS1。
浅绿色(添加):必须将该位置1,ADC才能连续运行(自由运行模式)。
PINK(MUX0-MUX4):这五个位用于告知输入通道。由于我们将使用ADC0或PIN0,因此无需像表中那样设置任何位。
棕色(ADPS0-ADPS2):这三个位用于设置ADC的预分频器。因为我们使用的预分频值为128,所以我们必须设置所有三个位。
暗绿色(ADSC):该位置1使ADC开始转换。当我们需要停止转换时,可以在程序中禁用该位。
要使用Arduino进行此项目,请参阅本教程:使用Arduino的数字温度计
编程说明
最好通过下面给出的C代码逐步解释温度测量的工作:
#include //标题,可通过引脚启用数据流控制
#define F_CPU 1000000 //已附加告诉控制器晶振的频率
#包括
#define E 5 //将名称“启用”到PORTD的第5引脚,因为它连接到LCD启用引脚
#define RS 6 //将名称“寄存器选择”指定给PORTD的第6引脚,因为它已连接到LCD RS引脚
void send_a_command(unsigned char命令);
void send_a_character(unsigned char character);
无效send_a_string(char * string_of_characters);
int main(无效)
{
DDRB = 0xFF; //将portB和portD用作输出引脚
DDRD = 0xFF;
_delay_ms(50); //延迟50ms
DDRA = 0; //将portA用作输入。
ADMUX-=(1 <
ADCSRA-=(1 <0)
{
send_a_character(* string_of_characters ++);
}
}