【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->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 triggertransform mode
ADC1->ADCFG |= ADCFG_ADCPRE_8 | ADCFG_ADCPRE_10; //8 fractional frequency
ADC1->ADCR &= ~(ADCR_ADMD_PERIOD | ADCR_ADMD_CONTINUE | ADCR_ALIGN_LEFT); //singleregistermode , 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
}
/////////////////////////////////////////////////////////////////////////////////
/// <a href="home.php?mod=space&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->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 starttransform
ADC1->ADCR |= ADC_CR_ADST;
while(puiADData < 2)
{
while(((ADC1->ADSTA ) & ADC_SR_ADIF) == 0);
ADC1->ADSTA |= ADC_SR_ADIF;
adc_array = (ADC1->ADDATA >> 16 & 0x0F);
}
}</code></pre>
<p>但是就是一直有一个问题是,采集的永远都是通道4的ADC值,感觉是哪个寄存器没配好,但又找不到,下面是串口输出的内容。</p>
<p></p>
<p>等这个问题解决了,就开始弄上位机了。</p>
<p>这片子的ADC的ENOB可以做到多少?</p>
freebsder 发表于 2020-11-10 22:50
这片子的ADC的ENOB可以做到多少?
<p>这个没在意,到时候看一下,很少接触交流电源。</p>
页:
[1]