59. SDM
59.1. 概述
SDM示例工程演示了SDM外设的对Sigma-Delta调制器输出的数据流进行数据采样和幅值检测的功能。
59.2. 主要特性
信号输入接口:
4组独立的CLK和DAT信号输入
每组CLK/DAT可独立配置采样模式
支持多种采样模式:
Mode 0: MCLK上升沿采样
Mode 1: MCLK上升沿和下降沿采样
Mode 2: Manchester编码模式
Mode 3: MCLK下降沿采样
Mode 4: 每2个MCLK上升沿采样
Mode 5: 每2个MCLK下降沿采样
数据滤波器(PCM_CIC):
支持4种滤波器类型:
Sinc1 (1阶)
Sinc2 (2阶)
Sinc3 (3阶)
SincFast (2阶快速)
可配置过采样率(1-256)
内置16深度32bit宽度FIFO
支持同步采样
支持掩码控制(指定版本)
可选时间戳输出功能(指定版本)
幅值检测器(AMP_CIC):
同样支持4种滤波器类型
独立的幅值监测通道
支持高/低门限检测
支持过零检测
可配置过采样率(1-32)
实时幅值输出
中断支持:
FIFO阈值中断
数据溢出中断
数据饱和中断
幅值超限中断
同步功能:
支持TRGMUX触发输入
支持TRGMUX触发输出
59.3. SDM初始化
相关结构体介绍:
sdm_control_t 结构体用于配置SDM的基本参数:
typedef struct { uint8_t clk_signal_sync; /* 时钟信号同步配置 */ uint8_t data_signal_sync; /* 数据信号同步配置 */ bool interrupt_en; /* 中断使能 */ } sdm_control_t;
sdm_channel_common_config_t 结构体用于配置通道公共参数:
typedef struct { uint8_t sampling_mode; /* 采样模式 */ bool enable_err_interrupt; /* 错误中断使能 */ bool enable_data_ready_interrupt; /* 数据就绪中断使能 */ } sdm_channel_common_config_t;
sdm_filter_config_t 结构体用于配置数据滤波器参数:
typedef struct { uint8_t fifo_threshold; /* FIFO阈值 */ uint8_t filter_type; /* 滤波器类型 */ uint16_t oversampling_rate; /* 过采样率 */ bool output_32bit; /* 32位输出使能 */ uint8_t sync_source; /* 同步源选择 */ /* 其他参数省略 */ } sdm_filter_config_t;
59.4. 数据滤波器配置
初始化函数API:
void sdm_init_module(SDM_Type *ptr, sdm_control_t *control); void sdm_config_channel_common_setting(SDM_Type *ptr, uint8_t ch_index, sdm_channel_common_config_t *config); void sdm_config_channel_filter(SDM_Type *ptr, uint8_t ch_index, sdm_filter_config_t *filter_config);
示例:
/* SDM基本初始化 */ sdm_control_t control = { .clk_signal_sync = 0xf, .data_signal_sync = 0xf, .interrupt_en = true }; sdm_init_module(HPM_SDM, &control); /* 配置通道采样模式 */ sdm_channel_common_config_t ch_config = { .sampling_mode = sdm_sampling_rising_clk_edge, .enable_err_interrupt = true, .enable_data_ready_interrupt = true }; sdm_config_channel_common_setting(HPM_SDM, channel, &ch_config); /* 配置数据滤波器 */ sdm_filter_config_t filter_config; sdm_get_channel_default_filter_config(HPM_SDM, &filter_config); filter_config.filter_type = sdm_filter_sinc3; filter_config.oversampling_rate = 256; sdm_config_channel_filter(HPM_SDM, channel, &filter_config);
59.5. 幅值检测器配置
配置函数API:
void sdm_config_channel_comparator(SDM_Type *ptr, uint8_t ch_index, sdm_comparator_config_t *cmp_config);
示例:
/* 配置幅值检测器 */ sdm_comparator_config_t cmp_config; sdm_get_channel_default_comparator_config(HPM_SDM, &cmp_config); cmp_config.high_threshold = threshold; cmp_config.en_high_threshold_int = true; cmp_config.filter_type = sdm_filter_sinc3; sdm_config_channel_comparator(HPM_SDM, channel, &cmp_config);
59.6. 数据传输
数据读取API:
int32_t sdm_get_channel_fifo_data(SDM_Type *ptr, uint8_t ch); int16_t sdm_get_channel_fifo_16bit_data(SDM_Type *ptr, uint8_t ch); uint16_t sdm_get_channel_comparator_data(SDM_Type *ptr, uint8_t ch);
示例:
/* 读取32位滤波数据 */ int32_t data = sdm_get_channel_fifo_data(HPM_SDM, channel); /* 读取16位滤波数据 */ int16_t data = sdm_get_channel_fifo_16bit_data(HPM_SDM, channel); /* 读取幅值检测结果 */ uint16_t amplitude = sdm_get_channel_comparator_data(HPM_SDM, channel);
59.7. 同步采样
同步采样配置:
选择同步信号源
配置TRGM模块连接
使能同步功能
示例:
/* 配置同步采样 */ filter_config.sync_source = sync_src; filter_config.fifo_clean_on_sync = 1; filter_config.wtsyncen = 1; filter_config.wtsynaclr = 1; sdm_config_channel_filter(HPM_SDM, channel, &filter_config); /* 配置TRGM连接 */ trgm_output_update_source(TRGM, output_index, input_src);
59.8. 示例工作流程
本示例提供了四种工作模式演示:
轮询模式采样 配置步骤:
初始化SDM模块,配置时钟和数据同步
配置通道采样模式为上升沿采样
配置数据滤波器:
选择Sinc3滤波器类型
设置过采样率为256
配置32位数据输出
使能SDM通道
轮询方式读取数据:
等待数据就绪标志
从FIFO读取采样数据
将数据转换为电压值显示
幅值检测模式
SDM使用幅值监测通道监测电压超限事件。设置幅值检测的高电压阈值为SDM_AMPLITUDE_HIGH_THRESHOLD,当输入模拟电压由小于阈值的情况增大到超出阈值时,触发错误中断。
配置步骤:
初始化SDM模块,配置时钟和数据同步和使能总中断功能
配置通道采样模式为上升沿采样和使能错误中断(赋值超限)
配置幅值检测器:
选择Sinc3滤波器类型
设置过采样率
配置高电压阈值(240mV)
使能高电压阈值中断
使能SDM通道
等待幅值超限中断:
中断处理中读取幅值
显示超限电压值
停止采样并清除中断标志
中断模式采样 配置步骤:
初始化SDM模块,配置时钟和数据同步和使能总中断功能
配置通道:
采样模式为上升沿采样
使能错误中断和数据就绪中断
配置数据滤波器:
选择Sinc3滤波器类型
设置过采样率为256
使能FIFO功能和阈值
使能SDM通道
中断处理流程:
FIFO达到阈值触发中断
读取FIFO中的数据
达到指定数据量后停止采样
同步信号采样模式
本例中使用GPTMR输出通过TRGMMUX配置连接到SDM的同步输入信号,当GPTMR的输出信号上升沿时触发SDM的同步事件。 SDM会根据同步信号进行采样,当同步事件发生时,SDM开始采样数据进入FIFO;当FIFO中的数据达到预设的阈值时,SDM会触发数据有效中断去读取数据,并且硬件会清除同步事件标志,停止继续采样直到下一个同步事件发生。
配置步骤:
初始化SDM模块,配置时钟和数据同步和使能总中断功能
配置SDM通道:
采样模式为上升沿采样
使能错误中断和数据就绪中断
配置数据滤波器:
选择Sinc3滤波器类型
设置过采样率为256
使能FIFO功能和阈值
选择同步信号源
使能同步采样功能
使能FIFO自动清除
使能数据就绪自动清除同步标志
使能SDM通道
配置GPTMR产生同步信号:
设置4秒周期
配置50%占空比
配置TRGM模块:
将GPTMR输出连接到SDM同步输入
同步采样流程:
等待同步事件触发
FIFO达到阈值后读取数据
自动清除同步标志
等待下一次同步事件
59.9. 硬件设置
请参考具体开发板 引脚描述 部分的描述。 根据开发板是否板载AD采样芯片,采用不同的接线方式:
无板载AD采样芯片:
需外接采样芯片
将采样芯片的CLK和DAT引脚连接到板上SDM的CLK和DAT引脚
有板载AD采样芯片:
直接将模拟信号接入采样芯片输入接口即可
59.10. 注意事项
本示例中提供了适用于AD7400、NSI1306等Sigma-Delta调制器(Full-scale ±320 mV)的输入电压与输出数值的转换公式, 如使用不同类型Sigma-Delta调制器请检查转换公式。
同步采样时需注意:
同步事件后的前几个采样可能不准确,建议忽略
不同滤波器类型需忽略的采样点数不同:
Sinc1: 0个
Sinc2: 1个
Sinc3: 2个
SincFast: 2个
16位数据输出模式下需要注意:
需要配置合适的移位值以避免数据溢出
不同滤波器类型和过采样率下的输出范围不同
59.11. 运行现象
运行工程后,通过串口可以看到菜单界面,输入相应数字可以执行不同的测试功能:
sdm example
*********************************************************************
* *
* SDM Example Menu *
* Please enter one of following SDM function test(e.g. 1 or 2 ...): *
* 1 - SDM sample data in polling mode *
* 2 - SDM amplitude threshold check *
* 3 - SDM sample data in interrupt mode *
* 4 - SDM sample data with sync signal *
* *
*********************************************************************
每种模式下会显示相应的测试结果,包括采样电压值或检测到的超限情况。
59.11.1. 1. SDM sample data in polling mode
SDM轮询数据有效标志并从FIFO中读出采样数据。
Selected option: 1
sdm sample data in polling mode.
203.57mV
203.17mV
203.31mV
203.14mV
203.01mV
203.28mV
203.17mV
203.05mV
203.19mV
203.21mV
203.02mV
203.19mV
203.43mV
203.17mV
203.29mV
203.24mV
59.11.2. 2. SDM amplitude threshold check
SDM使用幅值监测通道监测电压超限事件。设置幅值检测的高电压阈值为SDM_AMPLITUDE_HIGH_THRESHOLD,当输入模拟电压由小于阈值的情况增大到超出阈值时,触发错误中断。
Selected option: 2
Set amplitude high threshold 240mV
sdm channel comparator detected amplitude over the high threshold
voltage: 253.75mV
59.11.3. 3. SDM sample data in interrupt mode
SDM使用FIFO的数据有效标志进行采样,当FIFO中的数据达到预设的阈值时,SDM会触发数据有效中断,中断中读取数据,当读取的数据数目达到TEST_DATA_COUNT时停止继续采样。
Selected option: 3
sdm sample data in interrupt mode.
203.39mV
203.08mV
202.96mV
202.87mV
202.85mV
202.86mV
202.86mV
202.84mV
202.81mV
202.88mV
203.01mV
203.23mV
203.08mV
202.97mV
202.92mV
202.97mV
59.11.4. 4. SDM sample data with sync signal
本例中使用GPTMR输出通过TRGMMUX配置连接到SDM的同步输入信号,当GPTMR的输出信号上升沿时触发SDM的同步事件。 SDM会根据同步信号进行采样,当同步事件发生时,SDM开始采样数据进入FIFO;当FIFO中的数据达到预设的阈值时,SDM会触发数据有效中断去读取数据,并且硬件会清除同步事件标志,停止继续采样直到下一个同步事件发生。
Selected option: 4
sdm sample data with sync signal. 1 time
203.88mV
203.84mV
203.90mV
203.87mV
203.91mV
203.92mV
203.85mV
203.85mV
sdm sample data with sync signal. 2 time
203.90mV
203.96mV
203.97mV
203.93mV
203.94mV
203.86mV
203.89mV
203.90mV
sdm sample data with sync signal. 3 time
203.94mV
204.03mV
203.97mV
203.91mV
203.89mV
203.87mV
203.93mV
203.97mV
sdm sample data with sync signal. 4 time
203.93mV
204.13mV
204.14mV
204.16mV
204.17mV
204.13mV
204.14mV
204.12mV