例程提供的是PA0(ADC0),但是我不想用PA0口,因为这个口要用作唤醒功能,在这里我想用PC4 (ADC14),这个脚应该是悬空的,单次转换,仅开启SQ14,也就是只转换SQ14通道。设置规则转换数量0000(1个),SQ14编号为00000,其他通道大于00000,这样应该就可以了吧 ,可是得到的值不正确,接GND时 2.1V。
还有多通道的单次转换,比如开启SQ1 SQ2 SQ3 ,编号分别为0,1,2,通道数量为3个, 如果是扫描方式肯定会按SQ1,SQ2,SQ3自动顺序转换,如果是单次转换是什么情况?第一次转换肯定是SQ1,第二次转换是SQ1还是SQ2? 以下是SQ14的转换代码,不知道是哪里错了,难道设置1个通道只能从SQ1开始吗?求助原子哥帮忙!
#include "adc.h"
#include "lcd.h"
u16 ADC_Value;
void My_ADC_Init(void)
{
RCC->APB2ENR|=1<<4; //PC4
GPIOC->CRL&=0xFFF0FFFF; //port in PC4
RCC->APB2ENR|=1<<9; //ADC1 enable
RCC->APB2RSTR|=1<<9; //reset ADC
RCC->APB2RSTR&=~(1<<9); //close reset
RCC->CFGR&=~(3<<14); //clear clock set
RCC->CFGR|=2<<14; //set 12MHz 不超过14M
ADC1->CR1&=0X00000000; //clear
ADC1->CR2&=0X00000000; //clear
ADC1->CR2|=0<<11; // left algin
ADC1->CR2&=~(1<<1);
ADC1->CR2|=7<<17; //SWSTART 软件控制
ADC1->CR2|1<<20; //外部触发
ADC1->SQR1&=0x00000000; //1个通道
ADC1->SQR1|=0x0007E0FF; // 00000000 0000 0111|1 01110 00|000 01101 0x00 07 b8 0D
ADC1->SQR2&=0x00000000; // 00 01100 0|1011 0101|0 01001 01|000 00111 0X18 B5 25 07
ADC1->SQR2|=0xFFFFFFFF;
ADC1->SQR3&=0x00000000; // 00 00110 0|0101 0010|0 00011 00|010 00001 0x0C 52 0C 41
ADC1->SQR3|=0xFFFFFFFF;
ADC1->SMPR1&=0XFFFF1FFF;
ADC1->SMPR1|=7<<12; //通道14 239.5周期
ADC1->CR2|=1<<0; //必须先开启AD 数据手册有误
ADC1->CR2|=1<<3; //复位校准
while(ADC1->CR2&1<<3); //软件置位,硬件清除
ADC1->CR2|=1<<2; //AD校准
while(ADC1->CR2&1<<2); //软件置位,硬件清除
}
u16 GetADC(void)
{
ADC1->SQR1&=0xFFFFF70F;
// ADC1->SQR1|=0x22222702; //1个通道 不能确定是哪个通道! 14[9-5]
ADC1->SQR1|=0x0007FF0F;
ADC1->CR2|=1<<0; //启动AD
ADC1->CR2|=1<<22; //启动规则转换
while(!(ADC1->SR&1<<1)); //cheak EOC while(!(ADC1->SR&1<<1));//
ADC1->SR&=~(1<<1); //clear EOC
return ADC1->DR;
}
void Print_ADC(void)
{
float ADC_temp;
ADC_Value=GetADC();
LCD_ShowNum(156,180,ADC_Value,4,16);//显示ADC的值
ADC_temp=(float)ADC_Value*(3.3/4096);
ADC_Value=ADC_temp;
LCD_ShowNum(156,200,ADC_Value,1,16);//显示电压值
ADC_temp-=ADC_Value;
ADC_temp*=1000;
LCD_ShowNum(172,200,ADC_temp,3,16); //显示小数
}
|