import rp2
import utime
import machine
// 定义PIO程序
@rp2.asm_pio(
out_init=(rp2.PIO.OUT_LOW, rp2.PIO.OUT_LOW),
sideset_init=rp2.PIO.OUT_LOW,
autopull=True,
pull_thresh=32
)
def wave_generator():
// 使用X寄存器存储周期计数器
wrap_target()
out(x, 32) .side(0) //# 加载周期计数值
mov(y, x) .side(0) // # 复制到Y寄存器
label("channel1_loop")
out(pins, 1) .side(1) //# 输出通道1的位
out(pins, 1) .side(2) //# 输出通道2的位
jmp(y_dec, "channel1_loop") .side(0)// # 递减Y并循环
// 通道2的额外输出(当通道1结束但通道2继续时)
mov(y, x) .side(0) //# 重新加载周期计数
label("channel2_loop")
nop() .side(1) //# 通道1保持最后状态
out(pins, 1) .side(2) // # 输出通道2的位
jmp(y_dec, "channel2_loop") .side(0)
wrap()
// 序列定义
seq1 = "111112101101110000111211010111110101121110000111011010"
seq2 = "111010101101110010101001010"
// 将序列转换为位模式
def create_bit_pattern(seq):
bits = []
for char in seq:
if char == '0':
bits.append(0)
else: // '1' 和 '2' 都视为高电平
bits.append(1)
return bits
bits1 = create_bit_pattern(seq1)
bits2 = create_bit_pattern(seq2)
// 计算每个位的持续时间(单位:状态机周期)
def calculate_durations(bits, total_cycles):
total_bits = len(bits)
return [total_cycles // total_bits] * total_bits
// 创建状态机
sm = rp2.StateMachine(0, wave_generator, freq=10_000_000, out_base=machine.Pin(0), sideset_base=machine.Pin(2))
// 初始周期参数(360ms)
period_ms = 360
cycles_per_ms = 10_000 //# 10MHz时钟下每ms的周期数
total_cycles = period_ms * cycles_per_ms
// 计算每个位的持续时间
durations1 = calculate_durations(bits1, total_cycles)
durations2 = calculate_durations(bits2, total_cycles)
// 创建完整波形数据
def create_wave_data(bits, durations):
data = []
for bit, duration in zip(bits, durations):
// 每个位数据包含:持续时间(32位)和位值(1位)
data.append((duration << 1) | bit)
return data
wave_data1 = create_wave_data(bits1, durations1)
wave_data2 = create_wave_data(bits2, durations2)
// 启动状态机
sm.active(1)
// 主循环
while True:
// 发送通道1数据
for data in wave_data1:
sm.put(data)
//# 发送通道2数据
for data in wave_data2:
sm.put(data)
//# 可以在此处更改周期
//# new_period_ms = 400 # 示例:更改为400ms周期
//# total_cycles = new_period_ms * cycles_per_ms
//# durations1 = calculate_durations(bits1, total_cycles)
//# durations2 = calculate_durations(bits2, total_cycles)
//# wave_data1 = create_wave_data(bits1, durations1)
//# wave_data2 = create_wave_data(bits2, durations2)
utime.sleep_ms(10) //# 短暂延迟防止阻塞