打印
[MM32硬件]

单次转换时切换通道并采集的实现

[复制链接]
189|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
单次转换模式适用于需要采集单个通道数据的场景,但若需要切换通道,则需按以下步骤进行:

初始化 ADC
配置 ADC 的时钟、分辨率、转换模式,并使能目标 ADC 通道。

切换通道

设置 ADC 的通道选择寄存器如 ADC_CHSELR 或 MM32 平台的类似寄存器。
具体方法是通过修改通道号寄存器的值,例如设置为目标通道的序号。
触发转换

软件触发:直接设置软件启动转换寄存器位如 ADC_CR2_SWSTART。
确认 ADC 转换是否完成,通常通过查询状态位如 ADC_SR_EOC,转换完成标志位。
读取数据

在转换完成后,读取结果寄存器如 ADC_DR以获取采集数据。
重复切换

重复修改通道号寄存器的值,并再次触发单次转换。


使用特权

评论回复
沙发
怎么总是重复啊|  楼主 | 2024-12-24 14:20 | 只看该作者
代码示例:
假设使用一个定时器或主循环不断切换通道进行采样:

c
复制代码
// 配置 ADC 初始化
ADC_InitTypeDef ADC_InitStruct;
ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;   // 12 位分辨率
ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;   // 数据右对齐
ADC_InitStruct.ADC_ScanConvMode = DISABLE;            // 禁用扫描模式
ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 软件触发
ADC_Init(&ADC_InitStruct);

// 启用 ADC
ADC_Cmd(ENABLE);

while (1) {
    // 切换到通道 0
    ADC_RegularChannelConfig(ADC_Channel_0, 1, ADC_SampleTime_15Cycles);
    ADC_SoftwareStartConvCmd(ENABLE);   // 开始转换
    while (ADC_GetFlagStatus(ADC_FLAG_EOC) == RESET); // 等待转换完成
    uint16_t data0 = ADC_GetConversionValue(); // 读取数据

    // 切换到通道 1
    ADC_RegularChannelConfig(ADC_Channel_1, 1, ADC_SampleTime_15Cycles);
    ADC_SoftwareStartConvCmd(ENABLE);   // 开始转换
    while (ADC_GetFlagStatus(ADC_FLAG_EOC) == RESET);
    uint16_t data1 = ADC_GetConversionValue(); // 读取数据
}

使用特权

评论回复
板凳
怎么总是重复啊|  楼主 | 2024-12-24 14:20 | 只看该作者
普通通道转换 和 任意通道转换的区别
MM32 系列 ADC 模块的普通通道转换和任意通道转换主要体现在功能设计和用途上的差异:

普通通道转换:
用途:适用于预定义的固定采集通道顺序,通常由扫描模式或单次转换模式控制。
特性:
通道的采样顺序是由配置的通道选择寄存器(如ADC_CHSELR)确定。
需要手动切换通道或按照预定顺序采集。
示例:用于周期性采集某些关键信号,例如电源电压、传感器输出。
任意通道转换:
用途:允许动态选择通道采集,通常结合 DMA 或其他外部触发实现更复杂的采集需求。
特性:
通道选择灵活,可以在运行时更改采集的通道列表。
一些平台可能支持软件触发方式,快速切换和采集多个通道。
示例:用于多个传感器输入的非固定采样场景,或需要临时采样新信号的场景。

使用特权

评论回复
地板
怎么总是重复啊|  楼主 | 2024-12-24 14:20 | 只看该作者
使用场景与选型建议
如果采集的通道固定且顺序明确,使用普通通道转换即可,便于资源节省和逻辑简单化。
如果需要动态切换采集的信号通道或配合更高性能的外设如 DMA,可以考虑使用任意通道转换。
两者的核心在于通道的灵活性和控制复杂性,根据应用场景选择适合的方式即可。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

217

帖子

1

粉丝