acoo21st1980092 发表于 2011-9-19 15:23:24

关于STM8S ADC1单次扫描转换的问题

问题点:单次扫描转换,转换不成功。
现象:小弟设置ADC1为单次扫描转换,BUFFER使能,使能EOC中断,实际外接通道为AIN0和AIN1(均为DC 5v),结果发现进入EOC中断后数据缓冲寄存器ADC_DBxR 中只有CHANNEL0的BUFFER中有转换的数据,CHANNEL0的BUFFER数据一直为0.
源代码:
    /* Configure PB0,PB1 for ADC1 */
    GPIO_Init(GPIOB, GPIO_PIN_0, GPIO_MODE_IN_FL_NO_IT);  // Ain0  
    GPIO_Init(GPIOB, GPIO_PIN_1, GPIO_MODE_IN_FL_NO_IT);  // Ain1
void Init_ADC1(void)
{
    /* Initialize ADC1 in RESET value */
    ADC1_DeInit();
    
         /* Debug ADC1 scan mode */
        ADC1_ConversionConfig(ADC1_CONVERSIONMODE_SINGLE, ADC1_CHANNEL_0, ADC1_ALIGN_RIGHT);
                                                 //Configure the single conversion mode and the channel 0 to convert
                                                 //Configure ADC1 conversion value right align
        ADC1_SchmittTriggerConfig(ADC1_SCHMITTTRIG_CHANNEL0, DISABLE);
                                                 //Disable the schmitt trigger channel0
       
        ADC1_ConversionConfig(ADC1_CONVERSIONMODE_SINGLE, ADC1_CHANNEL_1, ADC1_ALIGN_RIGHT);
                                                 //Configure the single conversion mode and the channel 1 to convert
                                                 //Configure ADC1 conversion value right align
        ADC1_SchmittTriggerConfig(ADC1_SCHMITTTRIG_CHANNEL1, DISABLE);
                                                 //Disable the schmitt trigger channel1
        ADC1_ScanModeCmd(ENABLE);   //Enable scan mode
        ADC1_DataBufferCmd(ENABLE);   //Enable the ADC1 data store into the Data Buffer registers
        ADC1_ITConfig(ADC1_IT_EOCIE, ENABLE);    //Enable EOC interrupt
}
        /* start up converting every 500ms */       
        ADC1_Cmd(ENABLE);                         //Wake up ADC1
        Delay(2);
        ADC1_Cmd(ENABLE);                         //Start up conversion
INTERRUPT_HANDLER(ADC1_IRQHandler, 22)
 {
   /* In order to detect unexpected events during development,
       it is recommended to set a breakpoint on the following instruction.
    */
        /* Debug code */
        if(ADC1_GetFlagStatus(ADC1_FLAG_EOC) == 0x80)
        {
            ADC1_AIN0_Value = ADC1_GetBufferValue(0);
            ADC1_AIN1_Value = ADC1_GetBufferValue(1);
            ADC1_AIN2_Value = ADC1_GetBufferValue(2);
            ADC1_AIN3_Value = ADC1_GetBufferValue(3);
            ADC1_AIN4_Value = ADC1_GetBufferValue(4);
            ADC1_AIN5_Value = ADC1_GetBufferValue(5);
            ADC1_AIN6_Value = ADC1_GetBufferValue(6);
            ADC1_AIN7_Value = ADC1_GetBufferValue(7);
            ADC1_AIN8_Value = ADC1_GetBufferValue(8);
            ADC1_AIN9_Value = ADC1_GetBufferValue(9);
           
            ADC1_ClearITPendingBit(ADC1_IT_EOC);          
            ADC1_Cmd(DISABLE);                           //Close conversion
        }
}
调试的结果:ADC1_AIN0_Value 读入值正确,ADC1_AIN1_Value 一直为0(实际应为非0).
注:本人通过单通道轮询转换的方式,转换可行。
由于小弟刚使用STM8,请各位大侠不吝赐教!!

废鱼 发表于 2011-9-19 16:25:33

RE:关于STM8S ADC1单次扫描转换的问题

可能的愿意:
1、AD的时钟源没有开启。
2、 ADC1_GetBufferValue()代码获取AD值是否是对应AD的?

acoo21st1980092 发表于 2011-9-19 16:55:08

RE:关于STM8S ADC1单次扫描转换的问题

Sorry,时钟分频漏写了,追加如下:
ADC1_PrescalerConfig(ADC1_PRESSEL_FCPU_D2);
                     //Prescaler selection fADC1 = fcpu/2
测试结果为:AIN0转换有效,AIN1一直无转换值(ADC1_AIN1_Value = 0,且ADC_DB1RH = 0和ADC_DB1RL = 0).

acoo21st1980092 发表于 2011-9-20 09:50:11

RE:关于STM8S ADC1单次扫描转换的问题

按手册的解释应当是对齐的,“对于单次扫描模式,转换是从AIN0通道开始的,而且结果数据被存储在数据缓冲寄存器ADC_DBxR 中,当最后一个通道(通道‘n’)被转换完成后,EOC(转换结束)标志被置位,当EOCIE 位已被置位时将产生一个中断。可以从缓冲寄存器中读取各个通道的转换结果值。”

废鱼 发表于 2011-9-20 10:14:34

RE:关于STM8S ADC1单次扫描转换的问题

ADC1_GetBufferValue()这个代码如何处理的?

acoo21st1980092 发表于 2011-9-20 15:40:08

RE:关于STM8S ADC1单次扫描转换的问题

该函数为库函数,源码如下:
/**
* @briefGet one sample of measured signal.
* @param   Buffer specifies the buffer to read.
* @retval BufferValue:value read from the given buffer.
* @par Required preconditions:
* ADC1 conversion finished.
*/
uint16_t ADC1_GetBufferValue(uint8_t Buffer)
{
    uint16_t temph = 0;
    uint8_t templ = 0;
    /* Check the parameters */
    assert_param(IS_ADC1_BUFFER_OK(Buffer));
    if ((ADC1->CR2 & ADC1_CR2_ALIGN) != 0) /* Right alignment */
    {
      /* Read LSB first */
      templ = *(uint8_t*)(uint16_t)((uint16_t)ADC1_BaseAddress + (uint8_t)(Buffer

acoo21st1980092 发表于 2011-9-20 15:54:41

RE:关于STM8S ADC1单次扫描转换的问题

其中,ADC1_BaseAddress 为ADC1寄存器首地址,现在问题的关键是ADC_DB0RH 和 ADC_DB0RL的值读取正常,而ADC_DB0RH 和 ADC_DB0RL的值一直为0,且通过ADC1_CSR观察其转换的最终通道一直为AIN0。
所以,我怀疑单次扫描转换时,只转换了AIN0就产生中断,且AIN1一直未进行转换处理。原因为何不清楚?

废鱼 发表于 2011-9-20 16:21:10

RE:关于STM8S ADC1单次扫描转换的问题

1、如果是连续采集就要选择连续采集,如果想单次采集,那么采集完一次以后再进行第二次采集的配置。如此循环。

huoyubing 发表于 2013-4-27 16:41:36

RE:关于STM8S ADC1单次扫描转换的问题

求楼主给出完整程序

shuhan 发表于 2014-9-1 10:49:13

RE:关于STM8S ADC1单次扫描转换的问题

我今天也遇到一样的问题了,后来发现在配置ADC_CSR的通道之前需要先ADON一下激活ADC模块才行,希望对后面人有帮助

nightholder 发表于 2015-1-14 19:42:40

是不是激活AD后延时加长一点再读数,才有数据。

mubingml 发表于 2015-1-14 20:05:12

连续采样吧,这样得到的数据是实时的。

黑白之间79 发表于 2015-12-20 13:41:50

楼主问题解决了吗,我也遇到这样的问题了。使用查询方式是对的。中断就不行了。

玉石俱焚 发表于 2016-1-15 23:22:50

10楼正解!!!
页: [1]
查看完整版本: 关于STM8S ADC1单次扫描转换的问题