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

查看: 27701|回复: 13

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

[复制链接]

4

主题

18

回帖

0

蝴蝶豆

新手上路

最后登录
2019-3-24
发表于 2011-9-19 15:23:24 | 显示全部楼层 |阅读模式
问题点:单次扫描转换,转换不成功。
现象:小弟设置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,请各位大侠不吝赐教!!
<
回复

使用道具 举报

134

主题

4489

回帖

239

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2011-9-19 16:25:33 | 显示全部楼层

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

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

使用道具 举报

4

主题

18

回帖

0

蝴蝶豆

新手上路

最后登录
2019-3-24
 楼主| 发表于 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).
回复 支持 反对

使用道具 举报

4

主题

18

回帖

0

蝴蝶豆

新手上路

最后登录
2019-3-24
 楼主| 发表于 2011-9-20 09:50:11 | 显示全部楼层

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

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

使用道具 举报

134

主题

4489

回帖

239

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2011-9-20 10:14:34 | 显示全部楼层

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

ADC1_GetBufferValue()这个代码如何处理的?
回复 支持 反对

使用道具 举报

4

主题

18

回帖

0

蝴蝶豆

新手上路

最后登录
2019-3-24
 楼主| 发表于 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-&gt;CR2 &amp; ADC1_CR2_ALIGN) != 0) /* Right alignment */
    {
        /* Read LSB first */
        templ = *(uint8_t*)(uint16_t)((uint16_t)ADC1_BaseAddress + (uint8_t)(Buffer
回复 支持 反对

使用道具 举报

4

主题

18

回帖

0

蝴蝶豆

新手上路

最后登录
2019-3-24
 楼主| 发表于 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一直未进行转换处理。原因为何不清楚?
回复 支持 反对

使用道具 举报

134

主题

4489

回帖

239

蝴蝶豆

版主

最后登录
2020-12-9
发表于 2011-9-20 16:21:10 | 显示全部楼层

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

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

使用道具 举报

1

主题

14

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2013-4-27 16:41:36 | 显示全部楼层

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

求楼主给出完整程序
回复 支持 反对

使用道具 举报

0

主题

1

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2014-9-1 10:49:13 | 显示全部楼层

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

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

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版