打印

求助ADC的连续转换模式

[复制链接]
3317|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zxl6534|  楼主 | 2012-10-15 16:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
想用连续扫描模式的注入通道对一组输入信号进行实时的检测,可是我发现当我把ADC配置成扫描模式和连续模式时,扫描模式有作用而连续模式起不到作用。下面是我的ADC初始化代码
沙发
zxl6534|  楼主 | 2012-10-15 16:15 | 只看该作者
void Adc1_Init(void)
{   
        //先初始化IO口
        RCC->APB2ENR|=1<<2;    //使能PORTA口时钟
        RCC->APB2ENR|=1<<3;                //使能PORTB时钟
        GPIOA->CRL&=0X0000FFFF;//PA4、5、6 、7 模拟输入
        GPIOB->CRL&=0XFFFFFFF0;//PB0模拟输入
         
        RCC->APB2ENR|=1<<9;    //ADC1时钟使能          
        RCC->APB2RSTR|=1<<9;   //ADC1复位
        RCC->APB2RSTR&=~(1<<9);//复位结束            
        RCC->CFGR&=~(3<<14);   //分频因子清零(2分频)       
        //SYSCLK/DIV2=8M ADC时钟设置为8M,ADC最大时钟不能超过14M!
        //否则将导致ADC准确度下降! (8MHZ)

        ADC1->CR1&=0XF0FFFF;   //工作模式清零
        ADC1->CR1|=0<<16;      //选择工作模式为独立工作模式
          
        ADC1->CR1|=1<<8;            //扫描模式          
        ADC1->CR2|=1<<1;            //连续模式

        ADC1->CR1|=1<<7;      //允许产生JEOC中断
//        ADC1->CR1|=1<<5;      //允许产生EOC中断

        ADC1->CR2|=1<<23;           //起用温度传感器
          
        ADC1->CR2&=~(7<<17);          
        ADC1->CR2|=7<<17;           //软件控制转换  
        ADC1->CR2|=1<<20;      //使用用外部触发(SWSTART)!!!        必须使用一个事件来触发
        ADC1->CR2&=~(7<<12);          
        ADC1->CR2|=7<<12;           //软件控制转换  
        ADC1->CR2|=1<<15;      //使用用外部触发(SWSTART)!!!        必须使用一个事件来触发

        ADC1->CR2&=~(1<<11);   //右对齐

        ADC1->JSQR&=~(0XF<<20);
        ADC1->JSQR|=3<<20;     //4个转换在注入序列中
        ADC1->JSQR&=0XFFF00000;//
        ADC1->JSQR|=4<<0;           //4号通道  待定
        ADC1->JSQR|=7<<5;           //7号通道  24V       
        ADC1->JSQR|=8<<10;           //8号通道  12v
        ADC1->JSQR|=16<<15;           //16号通道 温度                 
                  
        //设置通道的采样时间
        ADC1->SMPR2&=0XF8000FFF;//通道4,5,6,7,8采样时间清空
        ADC1->SMPR2|=7<<12;      //通道4  239.5周期,提高采样时间可以提高精确度                 
        ADC1->SMPR2|=7<<21;      //通道7  239.5周期,提高采样时间可以提高精确度         
        ADC1->SMPR2|=7<<24;      //通道8  239.5周期,提高采样时间可以提高精确度

        ADC1->SMPR1&=0XE4FFFF;         //通道16采样时间清空
        ADC1->SMPR1|=7<<18;                 //通道16  239.5周期,提高采样时间可以提高精确度

        ADC1->CR2|=1<<0;            //开启AD转换器         
        ADC1->CR2|=1<<3;        //使能复位校准  
        while(ADC1->CR2&1<<3);  //等待复位结束                          
    //该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除。                  
        ADC1->CR2|=1<<2;        //开启AD校准          
        while(ADC1->CR2&1<<2);  //等待校准结束
        //该位由软件设置以开始校准,并在校准结束时由硬件清除
        MY_NVIC_Init(0,0,ADC1_2_IRQChannel,2);                 //ADC中断,最高优先级 组2
        ADC1->CR2|=1<<21;       //启动注入转换通道
}

使用特权

评论回复
板凳
zxl6534|  楼主 | 2012-10-15 16:17 | 只看该作者
这是我的中断服务函数,如果加入一句代码则ADC工作正常,否则只产生一次ADC转换
void ADC_IRQHandler(void)
{       
        if(ADC1->SR&(1<<2))                        //ADC1 发生JEOC中断
        {       
                ADC1->SR&=~(1<<2);                //清除中断标志位
                ADC1->CR2|=1<<21;              //不加入该句则ADC只产生一次转换
        }
}

使用特权

评论回复
地板
zxl6534|  楼主 | 2012-10-15 16:32 | 只看该作者
顶一下,有同样遇到过这个问题的朋友或者大神帮我看下嘛,谢谢

使用特权

评论回复
5
zxl6534|  楼主 | 2012-10-16 08:58 | 只看该作者
再顶下,都没人遇到过相似的问题么

使用特权

评论回复
6
acgean| | 2012-10-16 09:35 | 只看该作者
我也发现有这样的奇怪问题. 跟数据手册的说法有差异
另外, 对于楼主的程序, 虽然寄存器操作的执行代码很精炼, 但是看明白它还是有点累人
就加个中断服务吧.
这里, 只能你适应它了

使用特权

评论回复
7
zxl6534|  楼主 | 2012-10-16 11:49 | 只看该作者
我发现连续模式似乎只对规则通道起作用,而在手册里的描述是这样的:
在连续转换模式中,当前面ADC 转换一结束马上就启动另一次转换。此模式可通
过外部触发启动或通过设置ADC_CR2 寄存器上的ADON 位启动,此时CONT
位是1。
每个转换后:
● 如果一个规则通道被转换:
− 转换数据被储存在 16 位的ADC_DR 寄存器中
− EOC(转换结束)标志被设置
− 如果设置了 EOCIE,则产生中断。
● 如果一个注入通道被转换:
− 转换数据被储存在 16 位的ADC_DRJ1 寄存器中
− JEOC(注入转换结束)标志被设置
− 如果设置了 JEOCIE 位,则产生中断。

似乎其上的意思是对注入规则通道都应该有效的

使用特权

评论回复
8
airwill| | 2012-10-16 12:08 | 只看该作者
最近我的测试, 这个问题在 F3 上还是存在.
真让人郁闷着呢.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

26

帖子

0

粉丝