找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 747|回复: 3
收起左侧

mega16单片机利用ADS1115读取16位ADC

[复制链接]
ID:1111498 发表于 2024-2-24 15:51 来自手机 | 显示全部楼层 |阅读模式
读取结果总是不对,高位始终是0,麻烦大佬们帮忙看看哪儿有问题
image.jpg
回复

使用道具 举报

ID:342822 发表于 2024-2-27 10:40 | 显示全部楼层
你不妨用ADS1015代替ADS1115在Proteus 仿真调试验证一下。
回复

使用道具 举报

ID:1111498 发表于 2024-2-27 16:31 | 显示全部楼层
你好,我能请教你一些问题吗?我参照了您的那个帖子ADS1110的,但是我使用的是mega16,但是读取不出来数据,想请教一下您
回复

使用道具 举报

ID:342822 发表于 2024-2-27 22:00 | 显示全部楼层
Proteus 里没有ads1115模型但有一个ads1015.区别就是前者为16比特,后者为12比特
63.gif


$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


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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