你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
acoo21st1980092 提问时间:2011-9-19 15:23 /
问题点:单次扫描转换,转换不成功。
现象:小弟设置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,请各位大侠不吝赐教!!
收藏 1 评论13 发布时间:2011-9-19 15:23

举报

13个回答
废鱼 回答时间: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单次扫描转换的问题

该函数为库函数,源码如下:
/**
  * @brief  Get 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楼正解!!!
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版