|
一旦使用BSP_Tick_Init();
就无法连续从ADC获取新值,只能得到一个值,不再更新
不使用BSP_Tick_Init(); 就能持续更新
void ADC_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
//__IO uint16_t ADCConvertedValue;
// /* 使能 ADC1 and GPIOC clock */
// RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
//
// /* 配置PC2为模拟输入(ADC Channel12) */
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
// GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
// GPIO_Init(GPIOC, &GPIO_InitStructure);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
/* 配置模拟输入(ADC Channel) */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOC, &GPIO_InitStructure);
/* 配置为模拟输入(ADC Channel) */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* 配置为模拟输入(ADC Channel) */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/****************************************************************************
PCLK2 = HCLK / 2
下面选择的是2分频
ADCCLK = PCLK2 /8 = HCLK / 8 = 168 / 8 = 21M
ADC采样频率: Sampling Time + Conversion Time = 480 + 12 cycles = 492cyc
Conversion Time = 21MHz / 492cyc = 42.6ksps.
*****************************************************************************/
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE); //ADC1复位
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE); //复位结束
/* ADC Common 配置 ----------------------------------------------------------*/
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_20Cycles;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //不用DMA
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div8;
ADC_CommonInit(&ADC_CommonInitStructure);
/* ADC1 regular channel 12 configuration ************************************/
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfConversion = 1; /* 1个转换在规则序列中 也就是只转换规则序列1 */
ADC_Init(ADC1, &ADC_InitStructure);
/* 配置ADC1 规则通道12 channel12 configuration */
ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 1, ADC_SampleTime_56Cycles);
/* 使能 ADC1 */
ADC_Cmd(ADC1, ENABLE);
/* 软件启动ADC转换 */
// ADC_SoftwareStartConv(ADC1);
}
void AdcPro(void)
{
static uint16_t buf[SAMP_COUNT];
static uint8_t write;
uint32_t sum;
uint8_t i;
/* 软件启动下次ADC转换
说明: 如果没有转换完毕就再次启动下次ADC转换会导致ADC不工作。
每1ms执行一次该函数,转换已经完毕。
*/
buf[write] = ADC_GetConversionValue(ADC1);
if (++write >= SAMP_COUNT)
{
write = 0;
}
/* 下面这段代码采用求平均值的方法进行滤波
也可以改善下,选择去掉最大和最下2个值,使数据更加精确
*/
sum = 0;
for (i = 0; i < SAMP_COUNT; i++)
{
sum += buf[i];
}
g_usAdcValue[5] = sum / SAMP_COUNT; /* ADC采样值由若干次采样值平均 */
ADC_SoftwareStartConv(ADC1); //使能指定的ADC1的软件转换启动功能
}
|
|