Canmv k230 DAC案例——TLV5638
Canmv k230本身没有DAC 通过SPI接入一个两通道的DAC——TLV5638,实际性能受限于MicroPython,但通过简单尝试实现了,后续可能会尝试其他DAC与ADC
硬件接线如下:
接线
K230 | TLV5638 |
---|---|
SPIO_MOSI(IO16) | SDI |
SPIO_SCLK(IO15) | SCK |
CS(IO19) | CS |
整体代码如下:
from machine import SPI
from machine import FPIOA ,Pin
import time
import math # 提供一些基本的运算
# 实例化SPI的gpio
a = FPIOA()
# 设置gpio14为QSPI0_CS0功能
#a.set_function(14,a.QSPI0_CS0)
a.set_function(19, FPIOA.GPIO19)
pin_cs = Pin(19, Pin.OUT, pull=Pin.PULL_NONE, drive=15)
pin_cs.value(1)
# 设置gpio15为QSPI0_CLK功能
a.set_function(15,a.QSPI0_CLK)
# 设置gpio16为QSPI0_D0功能
a.set_function(16,a.QSPI0_D0)
# 设置gpio17为QSPI0_D1功能
a.set_function(17,a.QSPI0_D1)# 实例化SPI,使用5kHz时钟,极性为1,数据位宽为8bit
spi=SPI(1,baudrate=5000, polarity=1, phase=1, bits=8)def DAC_init():d1=0b11010000; # 写控制寄存器 1101 控制寄存器快速模式 电源正常d2=0b00000010; # 10 2.048V; 00 外部; 01 1.024V;11 外部pin_cs.value(0)spi.write(bytes([d1]))spi.write(bytes([d2]))pin_cs.value(1)def DAC_SPI_update_AandB(data,DAC1orDAC2):# 写A通道数据同时更新B的缓存 同时输出b=0b1000aa=0x0bb=0x0aa=(b<<4)|(data& 0xF00)>>8bb=data& 0xFF#print(bytes([aa]))#print(bytes([bb]))pin_cs.value(0)spi.write(bytes([aa]))spi.write(bytes([bb]))pin_cs.value(1)def DAC_SPI_writB(data,DAC1orDAC2):# 写通道B数据a=0b0001aa=0x0bb=0x0aa=(a<<4)|(data& 0xF00)>>8bb=data& 0xFF#print(aa)#print(bb)pin_cs.value(0)spi.write(bytes([aa]))spi.write(bytes([bb]))pin_cs.value(1)# DAC数据生成
PI = 3.14159265358979323846264338327950288419716939937510
# 这是一个要生成的数据,待测试数据
rx = []
rx2 = []
def input_data():# 这是一个基波for i in range(200):data0 = 1000 * math.sin(2 * 1 * PI * (i+1) / 200)+3000data1 = 1000 * math.sin(4 * 1 * PI * (i+1) / 200)+2000rx.append((int(data0)))rx2.append((int(data1)))
input_data()# 测试DAC
DAC_init()
data=0;
for i in range(20000):data=rx[i%200];data1=rx2[i%200];#time.sleep_ms(2);DAC_SPI_writB(data1,0)DAC_SPI_update_AandB(data,0);
后续,详细补充细节,可能会有更多AD/DA模块测试。。。