今天研读原子的书ADC这章节
ADC读不到数据,找了很久,郁闷,求大家给给点下
下图是硬件电路,CPU是STM32103VBH6 代码按照原子书库函数上面给的写的,其中修改了 GPIO口 和ADC通道
PC4我看原子书上写的是通道14
代码如下:大大们有空给指点下吧小弟新手。。。
void AdcInit(void)
{
GPIO_InitTypeDef tGPIO_InitStruct;
ADC_InitTypeDef tADC_InitStruct;
/*1. 开启GPIOC口时钟和ADC1的时钟,设置PC4为模拟输入*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_ADC1, ENABLE);
/* 设置PC4为输入, */
tGPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;/* 模拟输入 */
tGPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;
//tGPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;/* 最高输速率所以这里不用设置*/
GPIO_Init(GPIOC, &tGPIO_InitStruct);
/*2.复位ADC1,同时设置ADC1分频因子 */
//RCC_ADCCLKConfig(RCC_PCLK2_Div6);/* 设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M */
RCC_ADCCLKConfig(RCC_PCLK2_Div4);
ADC_DeInit(ADC1);
/*3.初始化ADC1参数,设置ADC1的工作模式以及规则序列的相关信息 */
tADC_InitStruct.ADC_Mode = ADC_Mode_Independent;/* ADC工作模式:ADC1和ADC2工作在独立模式 */
tADC_InitStruct.ADC_ScanConvMode = DISABLE;/* 模数转换工作在单通道模式 */
tADC_InitStruct.ADC_ContinuousConvMode = DISABLE;/* 模数转换工作在单次转换模式 */
tADC_InitStruct.ADC_ExternalTrigConv= ADC_ExternalTrigConv_None ;/* 转换由软件而不是外部触发启动 */
tADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;/* ADC数据右对齐 */
tADC_InitStruct.ADC_NbrOfChannel =1;/* 顺序进行规则转换的ADC通道的数目 */
ADC_Init(ADC1, &tADC_InitStruct);/* 根据tADC_InitStructz指定的参数初始化外设ADC的寄存器*/
/* 使能ADC并校准 设置完上面的信息后,就能使用AD转换器了,执行复位和AD校准,注意这两部是必须的
不校准将导致结果很不准确*/
/*下面是固定的模式直接写就行*/
ADC_Cmd(ADC1, ENABLE);/* 使能指定的ADC */
ADC_ResetCalibration(ADC1);/*执行复位校准 */
while(ADC_GetResetCalibrationStatus(ADC1));/* 等待复位校准结束 */
ADC_StartCalibration(ADC1);/* 开启AD校准 */
while(ADC_GetCalibrationStatus(ADC1));/* 等待校准结束*/
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能指定的ADC的软件转换启动功能
}
/* 获得ADC值 */
//iCh 通道值0~3
static int GetAdc(int iCh)
{
/* Configures ADC1 Channel2 as: first converted channel with an 7.5
cycles sample time */
//ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_7Cycles5);
/* Configures ADC1 Channel8 as: second converted channel with an 1.5
cycles sample time */
//ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 2, ADC_SampleTime_1Cycles5);
ADC_RegularChannelConfig(ADC1, iCh, 1, ADC_SampleTime_55Cycles5);
ADC_SoftwareStartConvCmd(ADC1, ENABLE);/* 使能指定的ADC1的软件转换启动功能 */
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));/*等待转换结束 */
return ADC_GetConversionValue(ADC1);/* 返回最后一次ADC1规则组的转换结果 */
}
/*
获取times次的平均值
iCh:通道号
iTimes:需要取多少次的(平均值)
*/
int GetAdcAverage(int iCh, int iTimes)
{
int iSum;
int i;
iSum = 0;
for(i= 0; i < iTimes; i++)
{
iSum = iSum + GetAdc(iCh);
delay_ms(5);
}
return (iSum /iTimes);
} |