adc.c文件:
/*----------------------------------------------------------------
* 文件名称: 多路ADC采样驱动程序
* 主控芯片: STM32F103RBT6
* 文件说明: PA0对应ADC_IN0,修改引脚的时候需注意
* 1.GPIO初始化的修改
* 2.Get_Adc(ADC_Channel_x)函数中x的修改
* 3.ADC模式设置不用修改
* 4.采样时间设置:设置Get_Adc()中的ADC_SampleTime
* 创建标识:416实验室 曹毅超
* 创建时间:2013.5.9
**----------------------------------------------------------------*/
//初始化ADC
//这里我们仅以规则通道为例
//我们默认将开启通道0~3
void Adc_Init(void)
{
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1 , ENABLE ); //使能ADC1通道时钟
//RCC_APB2Periph_GPIOx,x=GPIOx
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //AD采样时钟72M/6=12M,不能超过14M,否则精度下降
//PA0--ADC_IN0 PA1--ADC_IN1 PA2--ADC_IN2 PA3--ADC_IN3 PA4--ADC_IN4 PA5--ADC_IN5 PA6--ADC_IN6 PA7--ADC_IN7
//PB0--ADC_IN8 PB1--ADC_IN9 PC0--ADC_IN10 PC1--ADC_IN11 PC2--ADC_IN12 PC3--ADC_IN13 PC4--ADC_IN14 PC5--ADC_IN15
//PA0~3 4路作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //配置为模拟输入
GPIO_Init(GPIOA, &GPIO_InitStructure); //x=GPIOx
//------------------------------------ADC设置--------------------------------------------------------
ADC_DeInit(ADC1); //将外设 ADC1的全部寄存器重设为缺省值
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //模数转换工作在单通道模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模数转换工作在单次转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目,此处为1个通道
ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1
ADC_ResetCalibration(ADC1); //重置指定的ADC1的校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1)); //获取ADC1重置校准寄存器的状态,直到校准寄存器设置完成
ADC_StartCalibration(ADC1); //开始指定ADC1的校准状态
while(ADC_GetCalibrationStatus(ADC1)); //获取指定ADC1的校准程序,直到校准完成
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
}
//获得ADC值
//ch:通道值 0~3
u16 Get_Adc(u8 ch)
{ unsigned int result=0;
unsigned char i;
//设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道ch,规则采样顺序值序列为1,采样时间为239.5周期
for(i=0;i<8;i++)
{
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
result+=ADC_GetConversionValue(ADC1);
}
result=result/8; //取8次采样的平均值
return result; //返回平均值
}
main.c文件:
int main(void){
u16 adcx0,adcx1,adcx2,adcx3,adcx4,adcx5,adcx6;
float temp0,temp1,temp2,temp3,temp4,temp5,temp6;
SystemInit();
delay_init(72); //延时初始化
NVIC_Configuration();
uart_init(9600);
LCD_Init(); //PE.ALL,PD1~5
Adc_Init(); //PA0~3
LCD_ShowString(60,20,"ADC_CH0_VAL:");
LCD_ShowString(60,40,"ADC_CH0_VOL:0.000V");
LCD_ShowString(60,60,"ADC_CH1_VAL:");
LCD_ShowString(60,80,"ADC_CH1_VOL:0.000V");
LCD_ShowString(60,100,"ADC_CH2_VAL:");
LCD_ShowString(60,120,"ADC_CH2_VOL:0.000V");
LCD_ShowString(60,140,"ADC_CH3_VAL:");
LCD_ShowString(60,160,"ADC_CH3_VOL:0.000V");
LCD_ShowString(60,180,"ADC_CH4_VAL:");
LCD_ShowString(60,200,"ADC_CH4_VOL:0.000V");
LCD_ShowString(60,220,"ADC_CH5_VAL:");
LCD_ShowString(60,240,"ADC_CH5_VOL:0.000V");
LCD_ShowString(60,260,"ADC_CH6_VAL:");
LCD_ShowString(60,280,"ADC_CH6_VOL:0.000V");
while(1)
{
/第一路采样程序///
adcx0=Get_Adc(ADC_Channel_0);//ADC_Channel_x=ADC_INx,0~4096
LCD_ShowNum(156,20,adcx0,4,16);//显示ADC的值
temp0=(float)adcx0*(3.3/4096);
adcx0=temp0;
LCD_ShowNum(156,40,adcx0,1,16);//显示电压值
temp0-=adcx0;
temp0*=1000;
LCD_ShowNum(172,40,temp0,3,16);
// LED0=!LED0;
///第二路采样程序//
adcx1=Get_Adc(ADC_Channel_1); //ADC_Channel_x=ADC_INx,0~4096
LCD_ShowNum(156,60,adcx1,4,16);//显示ADC的值
temp1=(float)adcx1*(3.3/4096);
adcx1=temp1;
LCD_ShowNum(156,80,adcx1,1,16);//显示电压值
temp1-=adcx1;
temp1*=1000;
LCD_ShowNum(172,80,temp1,3,16);
///第三路采样程序//
adcx2=Get_Adc(ADC_Channel_2); //ADC_Channel_x=ADC_INx,0~4096
LCD_ShowNum(156,100,adcx2,4,16);//显示ADC的值
temp2=(float)adcx2*(3.3/4096);
adcx2=temp2;
LCD_ShowNum(156,120,adcx2,1,16);//显示电压值
temp2-=adcx2;
temp2*=1000;
LCD_ShowNum(172,120,temp2,3,16);
///第四路采样程序//
adcx3=Get_Adc(ADC_Channel_3); //ADC_Channel_x=ADC_INx,0~4096
LCD_ShowNum(156,140,adcx3,4,16);//显示ADC的值
temp3=(float)adcx3*(3.3/4096);
adcx3=temp3;
LCD_ShowNum(156,160,adcx3,1,16);//显示电压值
temp3-=adcx3;
temp3*=1000;
LCD_ShowNum(172,160,temp3,3,16);
///第五路采样程序//
adcx4=Get_Adc(ADC_Channel_4); //ADC_Channel_x=ADC_INx,0~4096
LCD_ShowNum(156,180,adcx4,4,16);//显示ADC的值
temp4=(float)adcx4*(3.3/4096);
adcx4=temp4;
LCD_ShowNum(156,200,adcx4,1,16);//显示电压值
temp4-=adcx4;
temp4*=1000;
LCD_ShowNum(172,200,temp4,3,16);
///第六路采样程序//
adcx5=Get_Adc(ADC_Channel_5); //ADC_Channel_x=ADC_INx,0~4096
LCD_ShowNum(156,220,adcx5,4,16);//显示ADC的值
temp5=(float)adcx5*(3.3/4096);
adcx5=temp5;
LCD_ShowNum(156,240,adcx5,1,16);//显示电压值
temp5-=adcx5;
temp5*=1000;
LCD_ShowNum(172,240,temp5,3,16);
///第七路采样程序//
adcx6=Get_Adc(ADC_Channel_6); //ADC_Channel_x=ADC_INx,0~4096
LCD_ShowNum(156,260,adcx6,4,16);//显示ADC的值
temp6=(float)adcx6*(3.3/4096);
adcx6=temp6;
LCD_ShowNum(156,280,adcx6,1,16);//显示电压值
temp6-=adcx6;
temp6*=1000;
LCD_ShowNum(172,280,temp6,3,16);
}
}