micropython 在測試架應用的功能庫整理
之前為了設計某方案的量產測試工具,使用 micropython + STM32 ,網上找了許多可以應用的工具庫,快速設計了原型。
而上位機的 prototype 也是用 python設計的 GUI框架,使用 threading 庫,控制不同的 microPython 測試架,執行不同的工作。
本來只想用python原型設計,讓軟體工程師理解各個項目需求,並與硬體工程師確認接口。做著做著,除了待測物相關的API,居然還運行得有模有樣的。。。
python 真是不錯的工具,雖然慢了些,但可以短時間的實現想像的設計方案原型,若用C/C++來實現,可能會瘋了。
找了許多microPython的庫可以完成不同的測試功能。這裡把找到的測試應用的功能庫整理出來,方便以後不同的功能應用。
micropython 提供有足夠好的庫,讓我們輕鬆的使用STM32的周邊。
這裡用pyboard的腳位定義示範,可以用不同板子的定義替換。
注意:所有硬件抽象,都有deinit() 成员函数,用来关闭功能以及对应的Callback。尤其是 Timer Callback,若不去关闭,会一直存在,有时会造成困扰。
1. 信号发生器:
A 雙通道任意波形
使用 STM32的兩個12bitDAC當示波器輸出。可以輸出任意波形,我做了128點的 sin wave波形,由兩個timer(7和8)控制兩個波形的輸出頻率。最高可以輸出82k的正弦波信號。Timer6打算做示波器輸入採樣頻率,避開。
# 由于硬件上接近0v和3.3v电压到达不了,波形会扭曲,振幅需要调整小些,取90%。
# 2048*0.9=1843
import math
from array import array as arr
buff = arr('H', 2048 + int(1843 * math.sin(2 * math.pi * i / 128)) for i in range(128))
from pyb import Timer, DAC
dac1=DAC(1,bits=12)
dac2=DAC(2,bits=12)
#通道1生成1Khz的12位精度正弦波。(采样率128kHz,使用Timer7)
dac1.write_timed(buff, Timer(7, freq=1000*128), mode=DAC.CIRCULAR)
#通道2生成440Hz标准频率的12位精度正弦波。(采样率56.320kHz,使用Timer8)
dac2.write_timed(buff, Timer(8, freq=440*128), mode=DAC.CIRCULAR)
B 三角波/鋸齒波
在通道1 (pin X5)产生1khz三角波:
from pyb import DAC
dac1=DAC(1,bits=12)
# 12bit 三角波的上升+下降,共需要 4096*2=8192個採樣點。頻率設定為希望頻率的8192倍。
dac1.triangle(1000*8192) #1k的三角波
三角波发生器Lib只能用频率参数,不能选其他Timer。如果两个通道都要用三角波,只能发相同樣式的波形。
2. 示波器:
使用 Timer6 做採樣頻率,同時讀取兩個ADC通道。採用阻塞式IO讀取,若同時要使用信號發生器,先設定好信號發生器,在做示波器的讀取。
from pyb import Pin, ADC, Timer
from array import array as arr
adc1 = ADC(Pin.board.X11) # Create ADC's
adc2 = ADC(Pin.board.X12)
t6 = Timer(6, freq=120000) # Create 120k samplerate timer
rx1 = arr('H', (0 for i in range(400))) # ADC buffers of
rx2 = arr('H', (0 for i in range(400))) # 100 16-bit words
# read analog values into buffers at 100Hz (takes one second)
pyb.ADC.read_timed_multi((adc1, adc2), (rx1, rx2), t6)
3. 類比開關信號切換規劃
【TBD】选用脚位:剩余的GPIO。之后打包选择切换方式。主要是stm32 F405/407 板子只有两个DAC,若需要对多个模拟输入、音频输入做测试或校正,会需要使用切换器。一般用74HC4067当切换开关。
4. 兩路 UART分別连接待測物和標準藍芽模組
micropython可以選擇編譯 BTStack 或 nimble 做藍牙工作。藍牙HCI-H4介面需要CTS/RTS流控腳位。另外需要GPIO控制藍牙模組的 reset。
UART設定如下:
UART(2)开启:(TX, RX, nRTS, nCTS) = (X3, X4, X2, X1) = (PA2, PA3, PA1, PA0)UART(3)开启:(TX, RX, nRTS, nCTS) = (Y9, Y10, Y7, Y6) = (PB10, PB11, PB14, PB13)
底下是通过UART2的通信api范例:
from pyb import UART
# 定义 uart 为二号 uart,可以先不打开通道。也可接着放 uart.init() 的参数,同时打开通道。
uart2 = UART(2)
# 初始化设定,只要包率即可工作,其他可用预设值
# uart.init (baud, bits=8, parity=None, stop=1, timeout=0, flow=0,
# timeout_char=0, read_buf_len=64)
uart2.init(115200,flow=uart.CTS|uart.rts) # 定义了包率,并采用CTS+RTS流控,其他为预设值
uart2.write('hello')
uart2.read(5) # 连续读5个字节(在timeout时间内连续读最多5个字节)
uart2.readline() # 在timeout时间内,连续读一行字串。(换行符结束字串)
uart2.any() # 查阅输入是否有内容,传回值是byte数。
uart2.deinit() # 关闭uart通道
5. 主机接口
共用 microPython 的 USB REPL 端口。會使用 (PA9, PA10, PA11, PA12) 不被其他GPIO或功能使用。
在debug时,可以使用 Control+C 中断主程式,进入REPL,再用 Control+D 重置平台,重新进入主程式。
release code可以关闭 Control+C,不进入REPL。
STM32 的 microPython 同时提供 USB MSC,主机可以直接对板上SD卡操作。release code时,可以关闭或重开此功能,以避免误入。
6. 测试架仪器端口
預留 UART6 當外接儀器連接口。最好用主機控制儀器,有儀控的 pyVISA 庫可使用。
7. 机器按键开关
【TBD】选用脚位:剩余的GPIO。
- 启动测试或其他用途。目前板上开关:
(X17) = (B3)。 - 或需要其他按键开关,可能用 ADC当开关。
8. 机器上灯号
目前板上有4个LED,LED1~4,对应到MCU的PA13~PA15,以及PB4,也就是板上的P5、P4、P3、P2脚位。
LED1,2 只能亮或暗,LED3,4还可以控制亮度,分别使用了Timer2和Timer3 的PWM资源。
可以用 Timer callback 控制 LED闪烁,用以表示不同系统状态。
from pyb import LED
led = LED(1) # 1=red, 2=green, 3=yellow, 4=blue
led.toggle()
led.on()
led.off()
# LEDs 3 and 4 support PWM intensity (0-255)
LED(4).intensity() # get intensity
LED(4).intensity(128) # set intensity to half
- 控制 LED1 每秒闪烁:
from pyb import Timer, LED
t1 = Timer(1)
t1.freq(0.5) # 0.5 Hz
t1.callback(lambda t: LED(1).toggle())
# 可以更改频率代表不同状况
t1.freq(3) # 3 Hz toggle
9. 通知声音
在烧录完成或测试完成可以发生通知完成或失败。利用 PWM 产生频率,晶体管放大后推动蜂鸣器发声。
【TBD】选用脚位:剩余的GPIO。
.assets/image-20210430184346663.png)
10. 频谱分析仪
目前找到两种方案,性能和Size考量,目前采用第二种方案:
- 第一种是 ulib,简化实现了标准的 numpy 和 scipy,需要重编micropython。
code:https://github.com/v923z/micropython-ulab - 第二种是快速傅立叶转换的 inline ARM Asm 实现,性能优异,且针对STM32的ADC接口工作。使用了浮点运算。未来也考虑自行嵌入到microPython系统中。
code:https://github.com/peterhinch/micropython-fourier
micropython-fourier LIB 相容性
使用了浮点运算,ARM的汇编指令实现。
- BLACK_F407VE
- config 的 RAM 不够,要关闭 ETH_MII。
- 接脚使用原始STM命名。
- dftadc 的 pin 没定义pin ‘X7’,改用 pin ‘PA6’。
- WeAct_F411CE
- F411 PA4~7用於 SPI Flash,不能使使用。
- 接脚使用原始STM命名。
- F411沒有 DAC,可用 PWM方波替代,pin 改 ‘PA0’。方波会有多次三倍频信号。
- F411 沒有 Timer6,函数呼叫要指定timer=5,ADC pin 改 ‘PA1’。
音频不需要太复杂分析,目前采用第二种方案,使用其DFTADC类。詳細用法參考官網的 README.md 內容。
DFTADC的构造函数的参数有:
length强制的。整数,定义转换长度。adcpin强制的。这可能需要一个ADC实例或能够定义一个例如一个对象'X7'或pyb.Pin.board.X19。winfunc=None窗口功能。请参阅README第4.3节。timer=6可以接受pyb.Timer实例或定时器号。定义用于数据采集的计时器。
DFTADC 的执行函数 run的参数有conversion,duration两个,执行时会阻塞系统。函数传回值为执行总耗时(uS)。run 的参数定义:
conversion必须是下表定义的转换类型选项之一 。duration整数或浮点数。采集持续时间(以秒为单位)。
| 变换类型选项 | 选项说明 |
|---|---|
| FORWARD | 正常正向变换。请参阅README的4.4。 |
| REVERSE | 执行反向转换。请参阅README的4.5。 |
| POLAR | 正向变换,结果为极坐标。参见README的4.6。 |
| DB | 按照POLAR,但幅度转换为dB。最大值 0dB 代表1VRMS,12bit 精度最小值是 -80dB。 |
- 例子 0.1秒内采样 ’X7‘ 128次,并对资料做DB形式的傅立叶变换:
import array
import math
import pyb
from dftclass import DFTADC, DB
def polarprint(objDFT):
print("Polar: mag (dB) phase (degs)")
fstr = "{:6d}{:8.2f} {:8.2f}"
for x in range(objDFT.length//2): # Only the first half is valid
print(fstr.format(x, objDFT.re[x], int(math.degrees(objDFT.im[x]))))
mydft = DFTADC(128, 'X7') # 初始化:对 'X7' 做 DFT 采样 128点(使用预设Timer6, 无窗函数)
mydft.run(DB, 0.1) # 采样时间为 0.1 秒。换算为频率的dB值。
polarprint(mydft) # 显示出采样数据
11. 蓝牙模块 GRFM
micropython 蓝牙还在试验阶段,但已经有工程。
预设的蓝牙 stack是 nimble 的BLE版本,可选 BTStack 支持经典蓝牙,但 BTstack 商用需要另外授权。
在 PYB 和 F407上需要重新设定编译 micropython。参考 PYBD_SF6的项目调整。
1 设定
mpconfigboard.mk :尾端加上
(尝试选btstack)
# cyue: 添加 bluetooth,nimBLE 和 BTStack二选一。
MICROPY_PY_BLUETOOTH ?= 1
MICROPY_BLUETOOTH_NIMBLE ?= 0
MICROPY_BLUETOOTH_BTSTACK ?= 1
#MICROPY_PY_LWIP = 1
#MICROPY_PY_USSL = 1
#MICROPY_SSL_MBEDTLS = 1
#MICROPY_VFS_LFS2 = 1
mpconfigboard.h :尾端加上 HCI port 设定,采用UART2。
// cyue: add Bluetooth config
#define MICROPY_HW_BLE_UART_ID (PYB_UART_2)
#define MICROPY_HW_BLE_UART_BAUDRATE (115200)
#define MICROPY_HW_BLE_UART_BAUDRATE_SECONDARY (1000000)
2. 修改编译烧录 microPython(DevEBox为例)
编译:
make BOARD=MCUDEV_DEVEBOX_F407VET6 -j
查看 RAM和 Flash使用情况:
...
LINK build-MCUDEV_DEVEBOX_F407VET6/firmware.elf
text data bss dec hex filename
401504 56 39000 440560 6b8f0 build-MCUDEV_DEVEBOX_F407VET6/firmware.elf
GEN build-MCUDEV_DEVEBOX_F407VET6/firmware0.bin
GEN build-MCUDEV_DEVEBOX_F407VET6/firmware1.bin
GEN build-MCUDEV_DEVEBOX_F407VET6/firmware.hex
GEN build-MCUDEV_DEVEBOX_F407VET6/firmware.dfu
...
烧录
make BOARD=MCUDEV_DEVEBOX_F407VET6 deploy
留言