內容目錄

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。

  1. 启动测试或其他用途。目前板上开关: (X17) = (B3)
  2. 或需要其他按键开关,可能用 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。

image-20210430184346663

10. 频谱分析仪

目前找到两种方案,性能和Size考量,目前采用第二种方案:

micropython-fourier LIB 相容性

使用了浮点运算,ARM的汇编指令实现。

  1. BLACK_F407VE
    • config 的 RAM 不够,要关闭 ETH_MII。
    • 接脚使用原始STM命名。
    • dftadc 的 pin 没定义pin ‘X7’,改用 pin ‘PA6’。
  2. WeAct_F411CE
    • F411 PA4~7用於 SPI Flash,不能使使用。
    • 接脚使用原始STM命名。
    • F411沒有 DAC,可用 PWM方波替代,pin 改 ‘PA0’。方波会有多次三倍频信号。
    • F411 沒有 Timer6,函数呼叫要指定timer=5,ADC pin 改 ‘PA1’。

音频不需要太复杂分析,目前采用第二种方案,使用其DFTADC类。詳細用法參考官網的 README.md 內容

DFTADC的构造函数的参数有:

  1. length强制的。整数,定义转换长度。
  2. adcpin强制的。这可能需要一个ADC实例或能够定义一个例如一个对象'X7'pyb.Pin.board.X19
  3. winfunc=None窗口功能。请参阅README第4.3节。
  4. timer=6可以接受pyb.Timer实例或定时器号。定义用于数据采集的计时器。

DFTADC 的执行函数 run的参数有conversionduration两个,执行时会阻塞系统。函数传回值为执行总耗时(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

最後修改日期: 2022 年 12 月 23 日

作者

留言

撰寫回覆或留言

發佈留言必須填寫的電子郵件地址不會公開。