本帖最后由 add00 于 2016-9-21 18:50 编辑
STM8L052 IAR环境下ADC单次采样,出现一个问题? 判断EOC后读出来的值和ADC_Cmd(ADC1,ENABLE)与ADC_SoftwareStartConv(ADC1)之间的延迟时间相关;
之前都说第一次采样的值不对,其实是第一次ADC_Cmd(ADC1,ENABLE)与ADC_SoftwareStartConv(ADC1)之间的延迟时间不够,当你加入足够的延时时,你会发现第一次采样的值也是正确的的。
IAR环境 HSI不分频
- while(1)
- {
- /* Config ADC Channel AIN7 */
- GPIO_Init(GPIOB,GPIO_Pin_1,GPIO_Mode_In_FL_No_IT );
-
- /* Enable ADC clock */
- CLK_PeripheralClockConfig(CLK_Peripheral_ADC1,ENABLE);
-
- ADC_DeInit(ADC1);
-
- /* Initialize and configure ADC1 */
- ADC_Init(ADC1,ADC_ConversionMode_Single,ADC_Resolution_12Bit,ADC_Prescaler_2);
- //单次转换 12位 2分频16/8 =2M
- /* Config ADC Sampling Time */
- ADC_SamplingTimeConfig(ADC1,ADC_Group_SlowChannels,ADC_SamplingTime_384Cycles);
- ADC_Cmd(ADC1,ENABLE); //使能ADC
-
- /* Enable ADC1 Channel 17*/
- ADC1->SQR[1] =0x02;
- // ADC_ChannelCmd(ADC1,ADC_Channel_17, ENABLE);
-
- /* Disable EOC interrupt */
- // ADC_ITConfig(ADC1,ADC_IT_EOC,DISABLE); //禁止ADC中断
-
- ADC_DMACmd(ADC1,DISABLE); //禁止DMA
- Delay(2000);
- Delay(2000);
- Delay(2000);
- Delay(2000);
- Delay(2000);
-
- ADC1->SR &=(~ADC_FLAG_EOC); //清FLAG
- ADC_SoftwareStartConv(ADC1); //启动AD采样
- do
- {
- End_Of_Conver =ADC1->SR;
- }
- while(0==(End_Of_Conver & ADC_FLAG_EOC));
- BAT_AD=0;
- BAT_AD=(uint8_t)(ADC_GetConversionValue(ADC1) >> 4);//取AD采样值高6位
- // ADC_ChannelCmd(ADC1, ADC_Channel_17, DISABLE);
- ADC1->SQR[1] =0x00;
-
- ADC_Cmd(ADC1,DISABLE); //禁止ADC采样
-
- GPIO_Init(GPIOB,GPIO_Pin_1,GPIO_Mode_Out_PP_Low_Slow); //端口输出拉低
-
- CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, DISABLE); //时钟停止
- }
复制代码
特殊应用,HALT ,所以每次初始化;
加断点时间最长 读数最大0932,200延时04CF,400延时0738,600延时0836,800延时08AC,1000延时08F0
具体效果见图
功耗比全部拉低稍大,与其工作时延时还不如端口不变,全速工作时间短点
一周热门 更多>