参照ALIENTEK 战舰stm32f1adc程序自己用到2路就写此文 //主函数部分 int main(void) { u8i; u16adcx; u32 adc1,adc2; float temp,temp2;
delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级 uart_init(115200); //串口初始化为115200 LED_Init(); //LED端口初始化 LCD_Init();
Adc_Init();
//ADC初始化
POINT_COLOR=RED;//设置字体为红色
LCD_ShowString(60,50,200,16,16,\ LCD_ShowString(60,70,200,16,16,\
LCD_ShowString(60,90,200,16,16,\LCD_ShowString(60,110,200,16,16,\ //显示提示信息
POINT_COLOR=BLUE;//设置字体为蓝色
LCD_ShowString(60,130,200,16,16,\
LCD_ShowString(60,150,200,16,16,\LCD_ShowString(60,250,200,16,16,\ while(1) { adcx=Get_Adc_Average(ADC_Channel_1,10); LCD_ShowxNum(156,130,adcx,4,16,0);//显示ADC的值 temp=(float)adcx*(3.3/4096); adcx=temp;
LCD_ShowxNum(156,150,adcx,1,16,0);//显示电压值 temp-=adcx; temp*=1000;
LCD_ShowxNum(172,150,temp,3,16,0X80); LED0=!LED0; delay_ms(250); /////
adc1=Get_Adc_Average2(ADC_Channel_9,10);
LCD_ShowxNum(156,230,adc1,4,16,0);//显示ADC的值 temp2=(float)adc1*(3.3/4096); adc1=temp2;
}
}
LCD_ShowxNum(156,250,adc1,1,16,0);//显示电压值 temp2-=adc1; temp2*=1000;
LCD_ShowxNum(172,250,temp2,3,16,0X80);
//ADC部分
void Adc_Init(void) { ADC_InitTypeDefADC_InitStructure; GPIO_InitTypeDefGPIO_InitStructure;
/// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE ); //使能ADC1通道时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_ADC1|RCC_APB2Periph_AFIO,ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
//PA1 作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); //////
//模拟输入引脚
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1; //选择你要设置的IO口 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
// GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率 GPIO_Init(GPIOB,&GPIO_InitStructure); /* 初始化GPIO */
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 = 2; //顺序进行规则转换的ADC通道的数目 ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
//// ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5); ADC_RegularChannelConfig(ADC1,ADC_Channel_9,2,ADC_SampleTime_239Cycles5); ADC_DiscModeChannelCountConfig(ADC1, 1); ADC_DiscModeCmd(ADC1, ENABLE);
ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1
ADC_ResetCalibration(ADC1); //使能复位校准
while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
ADC_StartCalibration(ADC1); //开启AD校准 while(ADC_GetCalibrationStatus(ADC1));
//等待校准结束
//使能指定的ADC1的软件转换启动
ADC_SoftwareStartConvCmd(ADC1, ENABLE); 功能 } //获得ADC值 //ch:通道值 0~3
u16 Get_Adc(u8 ch) {
//设置指定ADC的规则组通道,一个序列,采样时间 ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道,采样时间为239.5周期 ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC1的软件转换启动功能 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束 return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果 }
//u16 Get_Adc2(u8 ch2) //{
// //设置指定ADC的规则组通道,一个序列,采样时间
// ADC_RegularChannelConfig(ADC1, ch2, 2, ADC_SampleTime_239Cycles5 ); 通道,采样时间为239.5周期 //
// ADC_SoftwareStartConvCmd(ADC1, ENABLE); 功能 //
//ADC1,ADC
//使能指定的ADC1的软件转换启动
// while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
// return ADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果//// //}
u16 Get_Adc_Average(u8 ch,u8 times) { u32 temp_val=0; u8 t; for(t=0;t u16 Get_Adc_Average2(u8 ch,u8 tim) { u32 temp_val=0; u8 t; for(t=0;t