嵌入式学习小组
直播中

哈哈哈

9年用户 827经验值
擅长:可编程逻辑
私信 关注

M451系列ADC如何设置多通道连续转换?

M451系列,ADC如何设置多通道连续转换?有手册吗?

回帖(1)

wufan931111

2024-1-11 14:25:29
M451系列的ADC可以通过配置转换控制寄存器来实现多通道连续转换。具体步骤如下:

1. 确定需要转换的通道和转换顺序。

2. 配置转换控制寄存器ADC_CTL,设置转换的模式、分辨率、转换通道数量和转换顺序等参数。

3. 配置转换序列控制寄存器ADC_SEQ,设置转换的通道顺序和优先级。

4. 配置ADC中断、DMA等相关参数,以便在转换完成后及时获取数据。

以下是一个示例代码,通过开启ADC多通道连续转换模式实现了对两个通道的连续ADC转换:

```
#include "M451Series.h"

int32_t ADC_Result[2]; // 存储转换结果

void ADC_Init(void)
{
    CLK_EnableModuleClock(ADC_MODULE); // 使能ADC模块时钟
    CLK_SetModuleClock(ADC_MODULE, 0, CLK_CLKDIV0_ADC(6)); // 设置ADC时钟分频为6
    SYS_ResetModule(ADC_RST); // 复位ADC模块

    ADC_Open(ADC, 0, ADC_ADCR_DIFFEN_SINGLE_END); // 配置ADC模块
    ADC_SetExtendSampleTime(ADC, 0, 71); // 设置扩展采样时间

    ADC_POWER_ON(ADC); // 开启ADC电源
    ADC_EnableInt(ADC, ADC_ADF_INT); // 开启ADC转换完成中断
    NVIC_EnableIRQ(ADC_IRQn); // 使能ADC中断
}

void ADC_StartConverting(void)
{
    ADC_CLR_INT_FLAG(ADC, ADC_ADF_INT); // 清除ADC转换完成中断标志
    ADC_StartConvert(ADC); // 开始转换
}

void ADC_IRQHandler(void)
{
    if (ADC_GET_INT_FLAG(ADC, ADC_ADF_INT)) // 判断是否为ADC转换完成中断
    {
        ADC_Result[0] = ADC_GET_CONVERSION_DATA(ADC, 0); // 获取通道0转换结果
        ADC_Result[1] = ADC_GET_CONVERSION_DATA(ADC, 1); // 获取通道1转换结果
        ADC_StartConverting(); // 开始下一次转换
    }
}

int main(void)
{
    ADC_Init(); // 初始化ADC

    ADC_ConfigMultiCycleMode(ADC, ADC_CONTINUOUS_MODE, ADC_SEQMODE_TWO_CHANNEL); // 配置多通道连续转换模式

    ADC_ConfigSampleModule(ADC, ADC_SEQMODE_TWO_CHANNEL, ADC_MUX_ADC0, ADC_INPUT_MODE_SINGLE_END, 0); // 配置第一个通道
    ADC_ConfigSampleModule(ADC, ADC_SEQMODE_TWO_CHANNEL, ADC_MUX_ADC1, ADC_INPUT_MODE_SINGLE_END, 1); // 配置第二个通道

    ADC_StartConverting(); // 开始转换

    while (1); // 等待ADC中断

    return 0;
}
```

更多详细信息可以参考M451系列的数据手册和参考手册。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分