标题: mega16单片机利用ADS1115读取16位ADC [打印本页]

作者: 991005    时间: 2024-2-24 15:51
标题: mega16单片机利用ADS1115读取16位ADC
读取结果总是不对,高位始终是0,麻烦大佬们帮忙看看哪儿有问题

image.jpg (1.16 MB, 下载次数: 49)

image.jpg

作者: taotie    时间: 2024-2-27 10:40
你不妨用ADS1015代替ADS1115在Proteus 仿真调试验证一下。
作者: 991005    时间: 2024-2-27 16:31
你好,我能请教你一些问题吗?我参照了您的那个帖子ADS1110的,但是我使用的是mega16,但是读取不出来数据,想请教一下您

作者: taotie    时间: 2024-2-27 22:00
Proteus 里没有ads1115模型但有一个ads1015.区别就是前者为16比特,后者为12比特



$regfile = "m16def.dat"                                      ' specify the used micro
$crystal = 8000000                                          ' used crystal frequency
'$baud = 19200                                               ' use baud rate
$hwstack = 32                                               ' default use 32 for the hardware stack
$swstack = 32                                               ' default use 10 for the SW stack
$framesize = 64                                             ' default use 40 for the frame space


Declare Function Get_adc(byval Ain_x As Byte) As Integer

Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , Rs = Portb.0 , E = Portb.1

Config Lcd = 16 * 2                                         '配置液晶屏
Cursor Off Noblink


Dim Myinteger As Integer
Dim Voltage As Single
Dim Vol_str As String * 8



'采样接口引脚配置
Dim Channel(8) As Byte
'AIN0-AIN1                'AIN0-AIN3                'AIN1-AIN3                'AIN2-AIN3
Channel(5) = &B00000000 : Channel(6) = &B00010000 : Channel(7) = &B00100000 : Channel(8) = &B00110000
'AIN0-GND                 'AIN1-GND                 'AIN2-GND                 'AIN3-GND
Channel(1) = &B01000000 : Channel(2) = &B01010000 : Channel(3) = &B01100000 : Channel(4) = &B01110000

'配置引脚以用于I2C总线
Config Scl = PortC.0                                       '是串行时钟SCL
Config Sda = PortC.1                                        '是串行数据SDA
I2cinit

'*************************************************************************************
Cls
Do
   Myinteger = Get_adc(2)
   'Cls
   Locate 1 , 1
   Lcd Hex(myinteger)

   Voltage = Myinteger / 32768
   Voltage = Voltage * 4096
   Myinteger = Round(voltage)
   Vol_str = Str(myinteger)
   Vol_str = Format(vol_str , "0.000")
   Locate 2 , 1
   Lcd Vol_str

   Waitms 600
Loop
End

'*************************************************************************************
Function Get_adc(byval Ain_x As Byte) As Integer

   Local Config_high As Byte
   Local Config_low As Byte

   'addr_pin接地
   '写入ads1115的地址

   'W_addr = &H90
   '从ads1115读取的地址
   'R_addr = &H91

   Config_high = &B10000000
   Config_high = Config_high + Channel(2)
  Config_high = Config_high + &B00000010                   ' Pga(2)  ±4.096V
   'Config_high = Config_high + &B00000100                   ' Pga(3)  ±2.048V
   Config_low = &B10000000                                  ' 128SPS

   '初始化I2C
   I2cstart
   I2cwbyte &H90                                            ' W_地址
   I2cwbyte &B00000001                                      ' 指向Config寄存器
   I2cwbyte Config_high
   I2cwbyte Config_low
   I2cstop

   '读_ad
   I2cstart                                                 ' 生成起始码
   I2cwbyte &H90                                            ' W_addr发送地址
   I2cwbyte &B00000000                                      ' 指向转换寄存器
   I2cstart                                                 ' 起动条件
   I2cwbyte &H91                                            ' 读_addr的从机地址
   I2crbyte Config_high , Ack
   I2crbyte Config_low , Nack
   I2cstop

   Get_adc = Makeint(config_low , Config_high) '将两个字节压缩成一个字或整数。等效代码是:VARN=(256*MSB)+LSB

End Function







欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1