libiao3052 发表于 2018-1-17 15:02:55

STM8S001J3的ADC采集问题

STM8S001J3同时两路ADC采集,PC4的AIN2和PD6的AIN6,同样的配置方式,PD6数据正常,PC4的数据一直不变,单通道采集PC4数据也是不变化,下面贴上PD6和PC4的配置方式代码:
void ADC1_Config(void)
{
/*初始化 ADC1 通道6的IO口 */
GPIO_Init(GPIOD, GPIO_PIN_6, GPIO_MODE_IN_PU_NO_IT);
GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_NO_IT);

ADC1_PrescalerConfig(ADC1_PRESSEL_FCPU_D2);//预分频2
ADC1_ExternalTriggerConfig(ADC1_EXTTRIG_TIM,DISABLE);//不使用外部触发
ADC1_SchmittTriggerConfig(ADC1_SCHMITTTRIG_CHANNEL2,DISABLE);
ADC1_SchmittTriggerConfig(ADC1_SCHMITTTRIG_CHANNEL6,DISABLE);
//禁止AIN2 AIN4的施密特触发器,降低IO静态功耗
//PD5,PD6上的通道如果施密特方式禁用会导致串口无法收发数据!

ADC1_ConversionConfig(ADC1_CONVERSIONMODE_SINGLE,//单次转换
                        ADC1_CHANNEL_6,//配置通道号最大的那个
                        ADC1_ALIGN_RIGHT);//右对齐
ADC1_Cmd(ENABLE);//开启ADC
ADC1_ScanModeCmd(ENABLE);//开启扫描模式
}


下面是主函数代码:
while (1)   
{
    //ans = getchar();    //读取输入的字符
   // GPIO_WriteReverse(LED_GPIO_PORT, (GPIO_Pin_TypeDef)LED_GPIO_PINS);

    ADC1_StartConversion();//开启一次转换
    while(!ADC1_GetFlagStatus(ADC1_FLAG_EOC));//等待转换完成
    ADC1_ClearFlag(ADC1_FLAG_EOC);//软件清除
    Conversion_Value2=(u16)ADC1_GetBufferValue(ADC1_SCHMITTTRIG_CHANNEL2);//读取AIN2的值
    Conversion_Value6=(u16)ADC1_GetBufferValue(ADC1_SCHMITTTRIG_CHANNEL6);//读取AIN6的值
    printf("%d", Conversion_Value2);//把输入的字符发送出去
    Delay(100);
    printf("%d", Conversion_Value6);//把输入的字符发送出去
    Delay(100);
}

求高手解答!谢谢!

wenyangzeng 发表于 2018-1-17 15:32:29

本帖最后由 wenyangzeng 于 2018-1-17 15:38 编辑

参阅ST官方数据手册可知:PC4的ADC功能在AFR2,你必须在OPTION BYTE中配置PC4的AFR2功能。



同时:你的GPIO配置中:
GPIO_Init(GPIOD, GPIO_PIN_6, GPIO_MODE_IN_PU_NO_IT);
GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_NO_IT);
貌似应该2个通道都一致。
还有:如果你不是设置扫描方式,也应该对PC4的ADC进行配置。

す疯Ⅱ恒す 发表于 2018-1-17 15:35:16

通道2没打开??

hxydj 发表于 2018-1-19 16:26:16

PC4的模拟输入功能需要在选项字节中开启,如果没设置选项字节,则AIN2功能默认为没有开启。可以在串口烧写软件中配置选项字节。
页: [1]
查看完整版本: STM8S001J3的ADC采集问题