1.介绍
这次本来想使用ADC然后发送串口数据到上位机,结果发现官方例程已经实现了,那再写一遍没啥意义,看了一下官方例程是单周期扫描模式,同时只对一个ADC进行读取,想了一想改成多路ADC试一试呗,然后就开始看官方手册,并开始修改代码。
2.修改例程
开始先看了一下官方手册,只有一个ADC1是可以实现多个通道转换,看了一下开发板上的滑动变阻器分别再PA1,PA4,PA5引脚上。
然后看了一下连续扫描的逻辑和时序图,大概能理解。
然后就开始修改代码,把单周期扫描修改为连续周期扫描,这里似乎不修改也可以,然后修改串口输出为采集到的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值,感觉是哪个寄存器没配好,但又找不到,下面是串口输出的内容。
等这个问题解决了,就开始弄上位机了。
引用: freebsder 发表于 2020-11-10 22:50 这片子的ADC的ENOB可以做到多少?
这个没在意,到时候看一下,很少接触交流电源。