找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1726|回复: 0
收起左侧

INA168电流检测BASCOM AVR单片机程序

[复制链接]
ID:342822 发表于 2022-7-17 21:34 | 显示全部楼层 |阅读模式
电路原理图如下:
33gif.gif

avr单片机程序代码:
rem Main.bas file generated by New Project wizard
rem
rem Created:   周日 7月 17 2022    taotie
rem Processor: ATmega32
rem Compiler:  BASCOM-AVR

rem Write your code here

$crystal = 16000000
$regfile = "m32def.dat"

'$baud = 9600                      '串行接口

Dim S As String * 15 , Z As String * 15   '字符串转换变量


'...............................................................................
'ssd1306液晶屏设置
Config Scl = Portc.0                                 ' 用I2C引脚Scl = Portc.0 ,Sda = Portc.4
Config Sda = Portc.1
Config Twi = 400000                                  ' i2c 的速度

I2cinit
$lib "i2c_twi.lbx"                                   ' 不使用模拟的软I2C,而是使用twi
$lib "glcdSSD1306-I2C.lib"                           ' 用glcdSSD1306-I2C库替换默认库要添加在bascom avr库中

Config Graphlcd = Custom , Cols = 128 , Rows = 64 , Lcdname = "SSD1306"   '配置图形显示器

'*****************************************************************
'ADC控制器设置       呵呵~~~直接针对控制寄存器操作
Admux = &B11000000                '内部,2.56V,在AREF处有一个电容器,结果为10位,通道0.
Adcsra = &B11101111                ''ADC使能,开始转换,自动触发使能
                                   ',ADIF = 0
                                   'AD int使能,111 =预分频128

'ADC自动触发源设置
Set Sfior.7                        '101 =Timer1 匹配B
Reset Sfior.6
Set Sfior.5
'******************************************************************
On Adcc Adcinterrupt              

Dim Wadc As Word
'访问低字节和高字节:
Dim Wadcl As Byte At Wadc Overlay   
Dim Wadch As Byte At Wadc + 1 Overlay
'您可以使用Overlay覆盖来轻松访问WORD的低字节和高字节
'(同样的方法也适用于LONG)
'这就是将其存储在SRAM中的方式
'+ ----------- + ---------- +
'| 低字节|高字节|
'+ ----------- + ---------- +

Dim Value As Single
Dim Adkorr1 As Single
Dim Adkorr2 As Single
Dim Adc_complete As Bit
Adkorr1 = 2500 / 2501    '没有补偿。应根据实物调试情况修改
Adkorr2 = 0.0065          '这个是不是有点多余?

'......................................................
'Timer1比较->每秒中断”比较器B被使用,因为它必须用于ADC自动触发“但是:比较B,比较值必须在Compare1A中!
Dim Seconds As Long
Compare1a = 10'15625

'尽管发生了COMPARE B事件,但仍使用COMPARE1A!

Config Timer1 = Timer , Prescale = 1024 , Clear Timer = 1 , Compare B = Disconnect
On Compare1b Timer1_isr
'Enable Compare1b
TIMSK.OCIE1B=1     '等同Enable Compare1b
'Enable Interrupts
Sreg.7 = 1          '等同Enable Interrupts
'..............................................................................
'ADC准备就绪时,标志Adc_complete为1 ',然后获取并打印值
Do                          
If Adc_complete = 1 Then
Adc_complete = 0
Gosub Getvalue
Gosub Printvalues
End If
Loop
'---------------------------------------------------------------
Getvalue:               'Wadc由ADC完整中断更新,因此我们只需获取该值
Value = Wadc * 2.56
Value = Value / 1023
Value = Value * Adkorr1 'Adkorr1 2.5v补偿系数
Value = Value + Adkorr2 'Adkorr2  0v显示补偿值  

Return
'-------------------------------------------------------------------------------
Printvalues:
'cls
Setfont csdy
Lcdat 1, 6 , chr(33);chr(34);chr(35);chr(36);chr(37)
s=Str(Value)
z=Left(s , 6)       '截取采集值前6位数值
Setfont font12x16
'Lcdat 4, 1 ,Value  
Lcdat 5, 32 ,z;"A ";"  "
'"间隔1秒记录":
'Lcdat 7, 6 ,"S :";" ";Seconds
Return
'--------------------------------------------------------------------------------

Timer1_isr:
'寄存器ADCSRA和SFIOR中的“增量秒” ADC由硬件自动触发,由初始化设置
Incr Seconds
Return
'-------------------------------------------------------------------------------
Adcinterrupt:
'在ADC准备就绪时执行 更新Wadc并设置标志Adc_complete
Wadcl = Adcl
Wadch = Adch
Adc_complete = 1
Return

$include "../font12x16.font"

$include "../369.font"

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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