硬件:TPYboard一块,STM32F405,168MHz,Micropython
外设:AD7705,TM7705,16位AD,SPI接口
原因:由于STM32F405内置ADC精度不够,满足不了项目需求,故外置AD7705(淘宝,买现成的电路板),ADS1256(24位)。乘着国庆大假期间,先把AD7705的驱动编号。ADS1256还没有到货。
历时48小时,熟读AD7705 pdf,参考AD7705的C版本程序,改编,用python实现驱动,TPYBoard给出的SPI驱动有OLED,5110显示例程,可以参考。
代码(部分):如有需要,请email:ra00103@163.com,QQ:16183870
import pyb
import time
from pyb import SPI,Pin
class ADS7705:
#/* 寄存器选择 RS2 RS1 RS0 */
REG_COMM = 0x00 #, /* 通信寄存器 */
REG_SETUP = 0x10 #, /* 设置寄存器 */
REG_CLOCK = 0x20 #, /* 时钟寄存器 */
REG_DATA = 0x30 #, /* 数据寄存器 */
REG_ZERO_CH1= 0x60 #, /* CH1 偏移寄存器 */
REG_FULL_CH1= 0x70 #, /* CH1 满量程寄存器 */
REG_ZERO_CH2= 0x61 #, /* CH2 偏移寄存器 */
REG_FULL_CH2= 0x71 #, /* CH2 满量程寄存器 */
#/* 读写操作 */
WRITE = 0x00 #, /* 写操作 */
READ = 0x08#, /* 读操作 */
#/* 通道 */
CH_1 = 0#, /* AIN1+ AIN1- */
CH_2 = 1#, /* AIN2+ AIN2- */
CH_3 = 2#, /* AIN1- AIN1- */
CH_4 = 3# /* AIN1- AIN2- */
MD_NORMAL = (0 << 6)#, /* 正常模式 */
MD_CAL_SELF = (1 << 6)#, /* 自校准模式 */
MD_CAL_ZERO = (2 << 6)#, /* 校准0刻度模式 */
MD_CAL_FULL = (3 << 6)#, /* 校准满刻度模式 */
GAIN_1 = (0 << 3)#, /* 增益 */
#GAIN_2 = (1 << 3), /* 增益 */
#GAIN_4 = (2 << 3), /* 增益 */
#GAIN_8 = (3 << 3), /* 增益 */
#GAIN_16 = (4 << 3), /* 增益 */
#GAIN_32 = (5 << 3), /* 增益 */
#GAIN_64 = (6 << 3), /* 增益 */
#GAIN_128 = (7 << 3), /* 增益 */
#/* 无论双极性还是单极性都不改变任何输入信号的状态,它只改变输出数据的代码和转换函数上的校准点 */
BIPOLAR = (0 << 2)#, /* 双极性输入 */
UNIPOLAR = (1 << 2)#, /* 单极性输入 */
BUF_NO = (0 << 1)#, /* 输入无缓冲(内部缓冲器不启用) */
BUF_EN = (1 << 1)#, /* 输入有缓冲 (启用内部缓冲器) */
FSYNC_0 = 0#,
FSYNC_1 = 1# /* 不启用 */
CLKDIS_0 = 0x00#, /* 时钟输出使能 (当外接晶振时,必须使能才能振荡) */
CLKDIS_1 = 0x10#, /* 时钟禁止 (当外部提供时钟时,设置该位可以禁止MCK_OUT引脚输出时钟以省电 */
#/*
# 2.4576MHz(CLKDIV=0 )或为 4.9152MHz (CLKDIV=1 ),CLK 应置 “0”。
# 1MHz (CLKDIV=0 )或 2MHz (CLKDIV=1 ),CLK 该位应置 “1”
#*/
CLK_4_9152M = 0x08 #,
CLK_2_4576M = 0x00 #,
CLK_1M = 0x04 #,
CLK_2M = 0x0C #,
FS_50HZ = 0x00 #,
FS_60HZ = 0x01 #,
FS_250HZ = 0x02 #,
FS_500HZ = 0x04 #,
ZERO_0 = 0x00#
ZERO_1 = 0x80
def __init__(self,drdy,ce,rst,sck,di,do,softspi):
# init the SPI bus and pins
#spi.init(spi.MASTER, baudrate=328125,prescaler=32,bits=8, polarity=0, phase=1, firstbit=spi.MSB)
#self.spi=spi
if(softspi==1):
drdy.init(drdy.IN, drdy.PULL_UP) # Data ready
ce.init(ce.OUT_PP,ce.PULL_NONE) #chip enable pin
rst.init(rst.OUT_PP,rst.PULL_NONE)
sck.init(sck.OUT_PP,sck.PULL_NONE)
di.init(di.OUT_PP,di.PULL_NONE)
do.init(do.IN, do.PULL_NONE) # Data ready
rst.value(1)
ce.value(1)
sck.value(1)
di.value(1)
self.sck=sck
self.di=di
self.do=do
self.softspi=softspi
self.ce=ce
self.drdy=drdy
self.rst=rst
self.sodtspi=softspi
else:
drdy.init(drdy.IN, drdy.PULL_UP) # Data ready
ce.init(ce.OUT_PP,ce.PULL_NONE) #chip enable pin
rst.init(rst.OUT_PP,rst.PULL_NONE)
rst.value(1)
ce.value(1)
SPI = pyb.SPI(1) #DIN=>X8-MOSI/CLK=>X6-SCK/DO=>X7
SPI.init(SPI.MASTER,prescaler=64,bits=8, polarity=1, phase=1, firstbit=SPI.MSB)
self.spi=SPI
self.ce=ce
self.drdy=drdy
self.rst=rst
self.softspi=softspi
self.sleep_ms(10)
self.AD7705_ResetHard()
self.sleep_ms(10)
self.AD7705_SyncSPI()
self.AD7705_IntiCh()
#self.AD7705_CalibSelf(1)
#self.sleep_ms(5)
#/* 配置时钟寄存器 */
#self.AD7705_WriteByte(self.REG_CLOCK | self.WRITE | self.CH_1)#; /* 先写通信寄存器,下一步是写时钟寄存器 */
#self.AD7705_WriteByte(self.CLKDIS_0 | self.CLK_4_9152M | self.FS_50HZ); /* 刷新速率50Hz */
#//TM7705_WriteByte(CLKDIS_0 | CLK_4_9152M | FS_500HZ); /* 刷新速率500Hz */
#/* 每次上电进行一次自校准 */
#TM7705_CalibSelf(1); /* 内部自校准 CH1 */
self.sleep_ms(5);
def sleep_ms(self, mseconds):
try:
time.sleep_ms(mseconds)
except AttributeError:
machine.delay(mseconds)
def sleep_us(self, useconds):
try:
time.sleep_us(useconds)
except AttributeError:
machine.udelay(useconds)
#**************************************************************************************
#*
def AD7705_IntiCh(self):
self.AD7705_WriteByte(self.REG_CLOCK | self.WRITE | self.CH_1)# 先写通信寄存器,下一步是写时钟寄存器 */
self.AD7705_WriteByte(self.CLKDIS_0 | self.CLK_4_9152M | self.FS_50HZ)#刷新速率50Hz */
self.AD7705_WriteByte(0x10)#; /*选择设置寄存器,使用chnanel 1*/
self.AD7705_WriteByte(0x44)#; //写设置寄存器 ,设置成单极性、无缓冲、增益为1、滤波器工作、自校准
# if(_ch==1):
# self.AD7705_Send8Bit(0x20)#; /* 写通讯寄存器选中ch1*/
#self.AD7705_Send8Bit(self.CLKDIS_0 | self.CLK_4_9152M | self.FS_50HZ);# /* 刷新速率50Hz */)# /*4.9152MHz,
# self.AD7705_Send8Bit(0x0C)
# self.AD7705_Send8Bit(0x10)#; /*选择设置寄存器,使用chnanel 1*/
# self.AD7705_Send8Bit(0x40)#; //写设置寄存器 ,设置成单极性、无缓冲、增益为1、滤波器工作、自校准
#else:
# self.AD7705_Send8Bit(0x21)#; /* 写通讯寄存器选中ch2 */
# self.AD7705_Send8Bit(0x06)#; /* 2.4576MHz时钟,50Hz数据更新速率 */
#self.AD7705_Send8Bit(0x11)#; /*选择设置寄存器,使用chnane 2*/
#self.AD7705_Send8Bit(0x44)#; //写设置寄存器,设置成单极性、无缓冲、增益为1、滤波器工作、自校准
#*********************************************************************************************************
#* 函 数 名: AD7705_ResetHard
#* 功能说明: 硬件复位 TM7705芯片
#* 形 参: 无
#* 返 回 值: 无
#********************************************************************************************************
def AD7705_ResetHard(self):
self.rst.value(1)#RESET_1()
self.sleep_ms(1) #bsp_DelayMS(1)
self.rst.value(0)#RESET_0()
self.sleep_ms(2) #bsp_DelayMS(2)
self.rst.value(1)#RESET_1()
self.sleep_ms(1) #bsp_DelayMS(1)
print("Rest OK")
# self.sleep_ms(2000)
#*************************************************************
#SPI = pyb.SPI(1) #DIN=>X8-MOSI/CLK=>X6-SCK
#DIN =>SPI(1).MOSI 'X8' data flow (Master out, Slave in)
#CLK =>SPI(1).SCK 'X6' SPI clock
CE = pyb.Pin('X2')
DRDY = pyb.Pin('X4')
RST = pyb.Pin('X3')
SCK = pyb.Pin('X6')
DI = pyb.Pin('X8')
DO = pyb.Pin('X7')
ads7705 =ADS7705(DRDY,CE,RST,SCK,DI,DO,0)
print("Init OK")
#print(ads7705.drdy,ads7705.drdy.value())
#print(ads7705.ce,ads7705.ce.value())
while(1):
v=ads7705.AD7705_Average(1,10)
print(v)
#ads7705.sleep_ms(10)
#ads1256.AD7705_ReAD7705hipID()