找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1441|回复: 8
打印 上一主题 下一主题
收起左侧

BASCOM AVR ADS1110 _16-BIT模数转换器仿真

[复制链接]
跳转到指定楼层
楼主

$regfile = "m8def.dat"
$crystal = 8000000
'$baud = 19200



'Config Clockdiv = 1                                        ' 确保芯片以8 MHz运行
Config Scl = Portc.5                                        ' 使用i2c引脚
Config Sda = Portc.4
Config Twi = 400000                                         ' i2c 速度
I2cinit
$lib "i2c_twi.lbx"                                          ' 不使用模拟软I2C,使用硬TWI
$lib "glcdSSD1306-I2C.lib"                                  ' 用这个特殊的lib覆盖默认lib
Config Graphlcd = Custom , Cols = 128 , Rows = 64 , Lcdname = "SSD1306"

Config Single = Scientific , Digits = 3     '设置 单精度=科学计数法,保留点后位数
'Digits值为0将不会产生尾随零。1-7之间的值可用于指定逗号后面的位数。

' ADS1110的I2C 地址
'  -------------
' ADS1110的I2C地址是1001aaa,其中aaa是出厂时默认设置。ADS1110有8种不同类型,每种类型都有不同的I2C地址。封装上,
' ADS1110的每种类型都以EDx为标识,其中x表示地址变量。

'   部件               设备I2C设备地址               部件
'   型号            BIN        HEX        DEC       标记
' ---------       -------      ----       ---     -------
' ADS1110A0       1001000      0x48       72        ED0
' ADS1110A1       1001001      0x49       73        ED1
' ADS1110A2       1001010      0x4A       74        ED2
' ADS1110A3       1001011      0x4B       75        ED3
' ADS1110A4       1001100      0x4C       76        ED4
' ADS1110A5       1001101      0x4D       77        ED5
'ADS1110A6       1001110      0x4E       78        ED6
' ADS1110A7       1001111      0x4F       79        ED7
'  ----------------------------
Const ADS1110_DIZHI = &B10010001         '选择ED0标识的芯片ADS1110A0  地址:1001000 + 位0(读/写)
'Const Addressw = &B10010000                          '没使用

Dim dianya_zhuanhuan As Single                 '计算电压转换变量
Dim Pga As Integer                            '增益变量
Dim CELIANGh As Byte , CELIANGl As Byte        '数据测量变量
Pga = 1                                           '
Cls

Do
Gosub duqu                                      '调用测量读取计算子程序
Gosub xianshi                                   '调用测量结果子程序
Waitms 250
Waitms 50
Loop
End


'------------------------------------------------------------------------------
duqu:           '测量读取计算子程序
I2cstart
I2cwbyte ADS1110_DIZHI                        '读取地址
I2crbyte CELIANGh , Ack                       '测量读数   如果要读取更多字节,请指定ACK。
I2crbyte CELIANGl , Nack                      '如果NACK是要读取的最后一个字节,则指定NACK
I2cstop                                       '停止位

'转换这两个字节是通过一些简单的数学运算完成的。当以15 SPS采样时,ADS1110返回的值(不是电压)落在-32768和32767之间。
'该值的较高字节乘以 256,然后添加到较低的字节 – 然后乘以 2.048,最后除以 32768。

   dianya_zhuanhuan = CELIANGh * 256                       '左移至高8位
   dianya_zhuanhuan = dianya_zhuanhuan + CELIANGl           '添加低8位
   dianya_zhuanhuan = dianya_zhuanhuan * 2.048
   dianya_zhuanhuan = dianya_zhuanhuan / 32768
   dianya_zhuanhuan = dianya_zhuanhuan / Pga
dianya_zhuanhuan = dianya_zhuanhuan *1000    '扩大1千倍以mV单位显示
Return


'-----------------------------------------------------------------------------------
xianshi:                                         '在LCD上显示测量结果子程序
Setfont Font12x16
Lcdat 1, 6 , chr(130);chr(131);chr(132);":";'显示Font12x16.font中的汉字字符:“电压值”

Lcdat 5 , 20 , Fusing(dianya_zhuanhuan , "#.&");"mV" ;"    "        '12x16字体显示:保留小数点后3位.

Setfont Font8x8tt
Lcdat 2 , 64 , Fusing(dianya_zhuanhuan , "#.&");"mV" ;       '8x8字体显示

Return

'-------------------------------------------------------------------------------------------
$include "../Font12x16.font"                                   ' 字体文件
$include "../font8x8TT.font"





评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:342822 发表于 2023-10-9 21:53 | 只看该作者


来个动态的



回复

使用道具 举报

板凳
ID:1111498 发表于 2024-2-27 17:18 | 只看该作者
你好,我参照这个用MEGA16代替了mega8,读出来的数据全部是0,求大佬解答,十分感谢!
$regfile = "m16adef.dat"
$crystal = 12000000
$baud = 9600

Config Scl = Portc.0                                       
Config Sda = Portc.1
Config Twi = 400000                                         
I2cinit
$lib "i2c_twi.lbx"                                          ' 不使用模拟软I2C,使用硬TWI
$lib "glcdSSD1306-I2C.lib"                                  ' 用这个特殊的lib覆盖默认lib


Config Single = Scientific , Digits = 3     '设置 单精度=科学计数法,保留点后位数


Dim dianya_zhuanhuan As Single                 '计算电压转换变量
Dim Pga As Integer                            '增益变量
Dim CELIANGh As Byte , CELIANGl As Byte        '数据测量变量
Pga = 1                                           '


Do
Gosub xie                                     '调用测量读取计算子程序
Gosub duqu                                  '调用测量结果子程序
print dianya_zhuanhuan               'dianya_zhuanhuan
Waitms 250
Waitms 50
Loop
End


'------------------------------------------------------------------------------
xie:
I2cstart                                                'start condition
I2cwbyte &H90                                       'slave address
I2cwbyte &H8C                                         'asdress of EEPROM
I2cstop                                                 'stop condition
Waitms 10                                               'wait for 10 milliseconds
Return


duqu:           '测量读取计算子程序
I2cstart
I2cwbyte &H91                        '读取地址
I2crbyte CELIANGh , Ack                       '测量读数   如果要读取更多字节,请指定ACK。
I2crbyte CELIANGl , Nack                      '如果NACK是要读取的最后一个字节,则指定NACK
I2cstop                                       '停止位

   dianya_zhuanhuan = CELIANGh * 256                       '左移至高8位
   dianya_zhuanhuan = dianya_zhuanhuan + CELIANGl           '添加低8位
   dianya_zhuanhuan = dianya_zhuanhuan * 2.048
   dianya_zhuanhuan = dianya_zhuanhuan / 32768
   dianya_zhuanhuan = dianya_zhuanhuan / Pga
dianya_zhuanhuan = dianya_zhuanhuan *1000    '扩大1千倍以mV单位显示
Return
回复

使用道具 举报

地板
ID:342822 发表于 2024-2-27 22:24 | 只看该作者
先生,不能简单地套用啊~~~
这个ads1110只有一个adc通道。你那个1115有4个通道需另外要配置的
我已上传了别人写的程序及仿真动画图片,你再琢磨琢磨
回复

使用道具 举报

5#
ID:342822 发表于 2024-2-27 22:29 | 只看该作者


$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



回复

使用道具 举报

6#
ID:1111498 发表于 2024-2-27 22:35 | 只看该作者
我已经转战使用ADS1110了,没有使用ADS1115了。我只需要一个通道就可以。我现在是ADS1110和ATMEGA16。使用上面那个程序,读出来的数据全是0.0
麻烦大神指导指导
回复

使用道具 举报

7#
ID:342822 发表于 2024-2-28 00:11 | 只看该作者
转移到mega16只改动ADC引脚
这里有几个地方要注意
1.ADS1110封装标记在芯片属性里配置
2.字体文件要添加到代码页左边栏中。
附程序:
$regfile = "m16def.dat"
$crystal = 8000000
'$baud = 19200
'Config Clockdiv = 1                                        ' 确保芯片以8 MHz运行
Config Scl = Portc.0                                        ' 使用i2c引脚
Config Sda = Portc.1
Config Twi = 400000                                         ' i2c 速度
I2cinit
$lib "i2c_twi.lbx"                                          ' 不使用模拟软I2C,使用硬TWI
$lib "glcdSSD1306-I2C.lib"                                  ' 用这个特殊的lib覆盖默认lib
Config Graphlcd = Custom , Cols = 128 , Rows = 64 , Lcdname = "SSD1306"

Config Single = Scientific , Digits = 2     '设置 单精度=科学计数法,保留点后位数
'  ----------------------------
  Const ADS1110_DIZHI = &B10010001         '选择ED0标识的芯片ADS1110A0  地址:1001000 + 位0(读/写)
Const ADS1110_DIZHI_1 = &B10010011         '选择ED0标识的芯片
'Const Addressw = &B10010000                          '没使用
Dim dianya_zhuanhuan As Single                 '计算电压转换变量
Dim dianya_zhuanhuan_1 as Single
Dim Pga As Integer                            '增益变量
Dim CELIANGh As Byte , CELIANGl As Byte        '数据测量变量
Dim CELIANGh_1 As Byte , CELIANGl_1 As Byte        '数据测量变量
Pga = 1                                           '
Cls

Do
Gosub duqu_1
Gosub duqu                                      '调用测量读取计算子程序
Gosub xianshi                                   '调用测量结果子程序
Waitms 250
Waitms 50
Loop
End
'------------------------------------------------------------------------------
duqu:           '测量读取计算子程序
I2cstart
I2cwbyte ADS1110_DIZHI                        '读取地址
I2crbyte CELIANGh , Ack                       '测量读数   如果要读取更多字节,请指定ACK。
I2crbyte CELIANGl , Nack                      '如果NACK是要读取的最后一个字节,则指定NACK
I2cstop                                       '停止位

   dianya_zhuanhuan = CELIANGh * 256                       '左移至高8位
   dianya_zhuanhuan = dianya_zhuanhuan + CELIANGl           '添加低8位
   dianya_zhuanhuan = dianya_zhuanhuan * 2.048
   dianya_zhuanhuan = dianya_zhuanhuan / 32768
   dianya_zhuanhuan = dianya_zhuanhuan / Pga
dianya_zhuanhuan = dianya_zhuanhuan *1000    '扩大1千倍以mV单位显示
Return
duqu_1:
I2cstart
I2cwbyte ADS1110_DIZHI_1                        '读取地址
I2crbyte CELIANGh_1 , Ack                       '测量读数   如果要读取更多字节,请指定ACK。
I2crbyte CELIANGl_1 , Nack                      '如果NACK是要读取的最后一个字节,则指定NACK
I2cstop                                       '停止位
dianya_zhuanhuan_1 = CELIANGh_1 * 256                       '左移至高8位
   dianya_zhuanhuan_1 = dianya_zhuanhuan_1 + CELIANGl_1           '添加低8位
Return
'-----------------------------------------------------------------------------------
xianshi:                                         '在LCD上显示测量结果子程序
Setfont Font12x16
Lcdat 2 ,1, dianya_zhuanhuan ;"mV" ;"  "       '8x8字体显示
Return
'-------------------------------------------------------------------------------------------
$include "../Font12x16.font"                                   ' 字体文件
'$include "../font8x8TT.font"



回复

使用道具 举报

8#
ID:342822 发表于 2024-2-28 01:23 | 只看该作者
991005 发表于 2024-2-27 22:35
我已经转战使用ADS1110了,没有使用ADS1115了。我只需要一个通道就可以。我现在是ADS1110和ATMEGA16。使用 ...



按你提供的代码运行良好
$regfile = "m16adef.dat"
$crystal = 8000000
$baud = 9600

Config Scl = Portc.0                                       
Config Sda = Portc.1
Config Twi = 400000                                         
I2cinit
$lib "i2c_twi.lbx"                                          ' 不使用模拟软I2C,使用硬TWI
$lib "glcdSSD1306-I2C.lib"                                  ' 用这个特殊的lib覆盖默认lib


Config Single = Scientific , Digits = 3     '设置 单精度=科学计数法,保留点后位数


Dim dianya_zhuanhuan As Single                 '计算电压转换变量
Dim Pga As Integer                            '增益变量
Dim CELIANGh As Byte , CELIANGl As Byte        '数据测量变量
Pga = 1                                           '


Do
Gosub xie                                     '调用测量读取计算子程序
Gosub duqu                                  '调用测量结果子程序
print dianya_zhuanhuan               'dianya_zhuanhuan
Waitms 250
Waitms 50
Loop
End


'------------------------------------------------------------------------------
xie:

I2cstart
                                        'asdress of EEPROM                                               'start condition
I2cwbyte &H90                                       'slave address
I2cwbyte &H8C
I2cstop                                                 'stop condition
Waitms 10                                               'wait for 10 milliseconds
Return


duqu:           '测量读取计算子程序
I2cstart
I2cwbyte &H91                        '读取地址
I2crbyte CELIANGh , Ack                       '测量读数   如果要读取更多字节,请指定ACK。
I2crbyte CELIANGl , Nack                      '如果NACK是要读取的最后一个字节,则指定NACK
I2cstop                                       '停止位

   dianya_zhuanhuan = CELIANGh * 256                       '左移至高8位
   dianya_zhuanhuan = dianya_zhuanhuan + CELIANGl           '添加低8位
   dianya_zhuanhuan = dianya_zhuanhuan * 2.048
   dianya_zhuanhuan = dianya_zhuanhuan / 32768
   dianya_zhuanhuan = dianya_zhuanhuan / Pga
dianya_zhuanhuan = dianya_zhuanhuan *1000    '扩大1千倍以mV单位显示
Return



回复

使用道具 举报

9#
ID:342822 发表于 2024-2-28 10:03 | 只看该作者
问题可能出在单片机与终端通讯配置上:
1,要做到mega16属性中晶振频率与程序代码中的频率一致。
2,终端中波特率的选择与代码中的一致。
3,单片机与终端连接是叫擦连接即:TXD---RXD
试试看,祝你成功~~
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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