w494143467 发表于 2020-11-10 21:03

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

<p><strong>1.介绍</strong></p>

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

<p><strong>2.修改例程</strong></p>

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

<p></p>

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

<p></p>

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

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

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

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

    ADC1-&gt;ADCFG |= ADCFG_ADEN;//ADC1enable
    ADC1-&gt;ADCR |= ADCR_ADST;//Start Conversion
}
/////////////////////////////////////////////////////////////////////////////////
/// <a href="home.php?mod=space&amp;uid=159083" target="_blank">@brief</a> getADC1 transform data
/// @param    None
/// @retval   None
/////////////////////////////////////////////////////////////////////////////////
u16 ADC1_SingleChannel_Get(void)
{
    u16 puiADData;
    //ADCR deviceADSTbit enable, soft starttransform
    ADC1-&gt;ADCR |= ADC_CR_ADST;
    while(((ADC1-&gt;ADSTA ) &amp; ADC_SR_ADIF) == 0);

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

void ADC1_DoubleChannel_Get(u16 *adc_array)
{
    u16 puiADData = 0;
    //ADCR deviceADSTbit enable, soft starttransform
                ADC1-&gt;ADCR |= ADC_CR_ADST;
                while(puiADData &lt; 2)
                {
                        while(((ADC1-&gt;ADSTA ) &amp; ADC_SR_ADIF) == 0);

                        ADC1-&gt;ADSTA |= ADC_SR_ADIF;
                        adc_array = (ADC1-&gt;ADDATA &gt;&gt; 16 &amp; 0x0F);
                }
}</code></pre>

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

<p></p>

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

freebsder 发表于 2020-11-10 22:50

<p>这片子的ADC的ENOB可以做到多少?</p>

w494143467 发表于 2020-11-11 09:06

freebsder 发表于 2020-11-10 22:50
这片子的ADC的ENOB可以做到多少?

<p>这个没在意,到时候看一下,很少接触交流电源。</p>
页: [1]
查看完整版本: 【MM32 eMiniBoard测评】Part4:关于多通道ADC的问题