新手上路
- 积分
- 44
- 金钱
- 44
- 注册时间
- 2018-1-25
- 在线时间
- 12 小时
|
1金钱
adc采样IO对地接一个电阻,电路图如下附件,K7,K8悬空,这时候启动AD转换,PA0口转换值为0,PA1口转换值为100左右,
程序如下:
ADC_HandleTypeDef ADC1_Handler;
//功能:ADC初始化
void ADC1_Init(void)
{
ADC1_Handler.Instance = ADC1;
ADC1_Handler.Init.OversamplingMode = DISABLE;
ADC1_Handler.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
ADC1_Handler.Init.LowPowerAutoPowerOff = DISABLE;
ADC1_Handler.Init.LowPowerFrequencyMode = ENABLE;
ADC1_Handler.Init.LowPowerAutoWait = DISABLE;
ADC1_Handler.Init.Resolution = ADC_RESOLUTION_12B;
ADC1_Handler.Init.SamplingTime = ADC_SAMPLETIME_19CYCLES_5;
ADC1_Handler.Init.ScanConvMode = ADC_SCAN_DIRECTION_FORWARD;
ADC1_Handler.Init.DataAlign = ADC_DATAALIGN_RIGHT;
ADC1_Handler.Init.ContinuousConvMode = ENABLE;
ADC1_Handler.Init.DiscontinuousConvMode = DISABLE;
ADC1_Handler.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
ADC1_Handler.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
ADC1_Handler.Init.DMAContinuousRequests = DISABLE;
HAL_ADC_Init(&ADC1_Handler);
HAL_ADCEx_Calibration_Start(&ADC1_Handler, ADC_SINGLE_ENDED);//ADC自动校准
}
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
GPIO_InitTypeDef GPIO_InitStruct;
if(hadc->Instance==ADC1)
{
__HAL_RCC_ADC1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
}
void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc)
{
if(hadc->Instance==ADC1)
{
__HAL_RCC_ADC1_CLK_DISABLE();
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_6|GPIO_PIN_7);
}
}
//功能:获取ADC转换值
//参数:ch通道(ADC_CHANNEL_0),num 采样次数
//返回值:num次采样的平均数
u16 Get_Adc(u32 ch,u8 num)
{
u16 Value=0,t;
u32 sum=0;
u8 i=0;
u8 count=0;
ADC_ChannelConfTypeDef ADC1_ChanConf;
ADC1->CHSELR = (u32)0x00000000; //清空配置通道寄存器
ADC1_ChanConf.Channel= ch; //配置通道
ADC1_ChanConf.Rank=ADC_RANK_CHANNEL_NUMBER; //启用所选通道的序列
HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf); //通道配置
HAL_ADC_Start(&ADC1_Handler); //开启AD,开启AD的时候会清除标志HAL_ADC_STATE_REG_EOC
delay_ms(200);
for(i=0;i<num+1;i++)
{
HAL_ADC_PollForConversion(&ADC1_Handler,10); //等待轮询转换 超时10ms
if ((HAL_ADC_GetState(&ADC1_Handler) & HAL_ADC_STATE_REG_EOC) == HAL_ADC_STATE_REG_EOC)
{
t = HAL_ADC_GetValue(&ADC1_Handler);
if(i!=0){printf("-%d-",t);sum+=t;count++;}
}
}
HAL_ADC_Stop(&ADC1_Handler); //开启AD,开启AD的时候会清除标志HAL_ADC_STATE_REG_EOC
Value = sum/count;//多次转换求和取平均数
printf("ADC通道采样成功的次数:%d ",count);
printf("ADC通道采样的平均值: %d \r\n",Value);
return Value; //返回最近转换结果
}
主函数循环打印:
printf("ADC_ADC_CHANNEL_0_Value= %d\r\n",Get_Adc(ADC_CHANNEL_0,10));
delay_ms(100);
printf("ADC_ADC_CHANNEL_1_Value= %d\r\n",Get_Adc(ADC_CHANNEL_1,10));
delay_ms(100);
|
|