在PWM口线变化时刻,PIO实现的125M ADC触发信号出现脉宽变化。这将导致125M的采样时钟抖动厉害。普通GPIO操作也会导致抖动。PIO实现的SPI口线操作也会导致抖动。
PIO 125M 采集数据:[C] 纯文本查看 复制代码 /*-------------------------------------------------------------------------------
pio 程序 CH1 CH2 双通道采集模式
-------------------------------------------------------------------------------*/
#define dso_ch1ch2_wrap_target 0 // 循环入口
#define dso_ch1ch2_wrap 1 // 循环末尾
static const uint16_t dso_ch1ch2_program_instructions[] = {
// 0->1 时数据变化, 1->0时采样
C_IN | IN_SRC_PINS | 16 | SIDE_SET(0x00), // 16bit 输入移位
C_MOV | MOV_DEST_X | MOV_SRC_X | SIDE_SET(0x18),
// goto 0
};
static const struct pio_program dso_ch1ch2_program = {
.instructions = dso_ch1ch2_program_instructions,
.length = 2,
.origin = -1,
};
static inline pio_sm_config dso_ch1ch2_program_get_default_config(uint offset) {
pio_sm_config c = pio_get_default_sm_config();
sm_config_set_wrap(&c, offset + dso_ch1ch2_wrap_target, offset + dso_ch1ch2_wrap);
sm_config_set_sideset(&c, 2, false, false);
return c;
}
PWM部分代码:
[C] 纯文本查看 复制代码 #define PWM_TRIG_LEVEL_PIN 20 // 22
void PwmLevel(uint32_t _mv)
{
/* 实测PWM分辨率65535时,PWM频率 = 3.81KHz */
uint slice_num = pwm_gpio_to_slice_num(PWM_TRIG_LEVEL_PIN);
gpio_set_function(PWM_TRIG_LEVEL_PIN, GPIO_FUNC_PWM);
pwm_set_wrap(slice_num, 65535);
pwm_set_chan_level(slice_num, PWM_CHAN_A, 10);
pwm_set_enabled(slice_num, true);
}
|