[MCU] 【MM32 eMiniBoard测评】Part4:关于多通道ADC的问题

w494143467   2020-11-10 21:03 楼主

1.介绍

这次本来想使用ADC然后发送串口数据到上位机,结果发现官方例程已经实现了,那再写一遍没啥意义,看了一下官方例程是单周期扫描模式,同时只对一个ADC进行读取,想了一想改成多路ADC试一试呗,然后就开始看官方手册,并开始修改代码。

2.修改例程

开始先看了一下官方手册,只有一个ADC1是可以实现多个通道转换,看了一下开发板上的滑动变阻器分别再PA1,PA4,PA5引脚上。

6.png

然后看了一下连续扫描的逻辑和时序图,大概能理解。

5.png 4.png

然后就开始修改代码,把单周期扫描修改为连续周期扫描,这里似乎不修改也可以,然后修改串口输出为采集到的ADC通道而不是采集到的ADC电压值,代码如下。

void ADC1_SingleChannel(void)
{
    RCC->AHBENR |= RCC_AHBENR_GPIOA; //enable GPIOA clock
    RCC->APB2ENR |= RCC_APB2ENR_ADC1EN; //enableADC1clock
    GPIOA->CRL &=  ~(GPIO_CNF_MODE_MASK << GPIO_CRL_CNF_MODE_1_Pos);
    GPIOA->CRL |= GPIO_CNF_MODE_AIN << GPIO_CRL_CNF_MODE_1_Pos;

    RCC->APB2RSTR |= RCC_APB2RSTR_ADC1RST; //ADC1reset
    RCC->APB2RSTR &= ~(RCC_APB2RSTR_ADC1RST); //reset   end

    //ADC configure single soft trigger  transform mode
    ADC1->ADCFG |= ADCFG_ADCPRE_8 | ADCFG_ADCPRE_10; //8 fractional frequency
    ADC1->ADCR &= ~(ADCR_ADMD_PERIOD | ADCR_ADMD_CONTINUE | ADCR_ALIGN_LEFT); //singleregister  mode , Data right-justified
    ADC1->ADCR |= ADCR_ADMD_CONTINUE;
    ADC1->ADCHS = ADCHS_CHEN1 | ADCHS_CHEN4; //enable channel 1

    ADC1->ADCFG |= ADCFG_ADEN;//ADC1enable
    ADC1->ADCR |= ADCR_ADST;//Start Conversion
}
/////////////////////////////////////////////////////////////////////////////////
/// @brief getADC1 transform data
/// @param    None
/// @retval   None
/////////////////////////////////////////////////////////////////////////////////
u16 ADC1_SingleChannel_Get(void)
{
    u16 puiADData;
    //ADCR deviceADSTbit enable, soft start  transform
    ADC1->ADCR |= ADC_CR_ADST;
    while(((ADC1->ADSTA ) & ADC_SR_ADIF) == 0);

    ADC1->ADSTA |= ADC_SR_ADIF;
    puiADData = ADC1->ADDATA & 0xfff;
    return puiADData;
}

void ADC1_DoubleChannel_Get(u16 *adc_array)
{
    u16 puiADData = 0;
    //ADCR deviceADSTbit enable, soft start  transform
		ADC1->ADCR |= ADC_CR_ADST;
		while(puiADData < 2)
		{
			while(((ADC1->ADSTA ) & ADC_SR_ADIF) == 0);

			ADC1->ADSTA |= ADC_SR_ADIF;
			adc_array[puiADData++] = (ADC1->ADDATA >> 16 & 0x0F);
		}
}

但是就是一直有一个问题是,采集的永远都是通道4的ADC值,感觉是哪个寄存器没配好,但又找不到,下面是串口输出的内容。

3.png

等这个问题解决了,就开始弄上位机了。

回复评论 (2)

这片子的ADC的ENOB可以做到多少?

默认摸鱼,再摸鱼。2022、9、28
点赞  2020-11-10 22:50
引用: freebsder 发表于 2020-11-10 22:50 这片子的ADC的ENOB可以做到多少?

这个没在意,到时候看一下,很少接触交流电源。

点赞  2020-11-11 09:06
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复