打印
[STM8]

STM8L151K4 DAC影响ADC转换

[复制链接]
3000|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pofu007|  楼主 | 2015-9-16 09:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 pofu007 于 2015-9-16 10:00 编辑

stm8l15x这个封装没有外部参考电压引脚,AD和DA都采用VCC做为参考电压,我测试了stm8的内部通道ADC_Channel_Vrefint,这个电压的典型值时1.224V,在不使用DA模块的情况下转换的结果是正确的(3.3V供电,转换值为1520),如果使用DA模块,会随着DA输出的变化使得这个通道AD转换值也跟着发生变化(转换采用软件触发的方式,其他通道也同样的情况),这个找不到原因求助。
补充:
以ADC_Channel_Vrefint通道为例,DAC是否enable output buffer对ADC转换有很大影响,关闭output buffer的时候转换值更接近准确值。
并且,DAC输出以一定的步长增加时,ADC的转换值也以对应的步长在增加,当然两者的步长值是不一样的。
DAC开启output buffer的时候,ADC转换值增加的步长比较大,关闭output buffer的时候,ADC转换值增加的步长就很小,单还有增长的现象。

贴下我相关的代码。void ADC_Config(void)
{
        // Enable ADC1 clock
          CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, ENABLE);


        ADC_Init(ADC1, ADC_ConversionMode_Single, ADC_Resolution_12Bit, ADC_Prescaler_2);
        ADC_SamplingTimeConfig(ADC1, ADC_Group_SlowChannels, ADC_SamplingTime_384Cycles);
        ADC_SamplingTimeConfig(ADC1, ADC_Group_FastChannels, ADC_SamplingTime_384Cycles);
        
         
        // Enable ADC1 Channels connected to VROUT
//          ADC_ChannelCmd(ADC1, ADC_Channel_15, ENABLE);
        ADC_ChannelCmd(ADC1, ADC_Channel_Vrefint, ENABLE);
        
        ADC_DMACmd(ADC1, ENABLE);
        ADC_VrefintCmd(ENABLE);
        McuWaitUs(50);

}


void DAC_Config(void)
{
         // Enable DAC clock
        CLK_PeripheralClockConfig(CLK_Peripheral_DAC, ENABLE);
               
        // Enable comparator clock, for RI function
        CLK_PeripheralClockConfig(CLK_Peripheral_COMP, ENABLE);


        DAC_DeInit();
        
        DAC_Init(DAC_Channel_1, DAC_Trigger_None, DAC_OutputBuffer_Enable);
        
        DAC_Cmd(DAC_Channel_1, ENABLE);
        
        // DAC电压值由PB6输出
        SYSCFG_RIAnalogSwitchConfig(RI_AnalogSwitch_4, ENABLE);
        SYSCFG_RIIOSwitchConfig(RI_IOSwitch_13, ENABLE);
}


void ADConvert(void)
{
        uint16_t max = 0;
        uint16_t min = 0x0fff;
        uint16_t tmp = 0;
        uint8_t i = 0;
        uint16_t adcValue = 0;
        
        ADC_SoftwareStartConv(ADC1);  // 注意ADC使能后,第一次转换的数据需要抛弃
        
        while(!(ADC_FLAG_EOC & ADC1->SR));
        
        tmp = ADC_GetConversionValue(ADC1);
        
        for(i = 10; i > 0; i--)
        {
                ADC_SoftwareStartConv(ADC1);
               
                while(!(ADC_FLAG_EOC & ADC1->SR));
               
                tmp = ADC_GetConversionValue(ADC1);
               
                if(tmp > max)
                {
                        max = tmp;
                }
               
                if(tmp < min)
                {
                        min = tmp;
                }
               
                adcValue += tmp;
               
                McuWaitUs(1000);
        }
        
        acdValue = (adcValue - max - min) >> 3;
}

  



沙发
mmuuss586| | 2015-9-16 09:58 | 只看该作者
实际值差多少呢?
和布线,以及电源的功率,电源的稳定性有关;
还有ST 芯片本身的原因

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
pofu007 + 3
板凳
pofu007|  楼主 | 2015-9-16 10:13 | 只看该作者
mmuuss586 发表于 2015-9-16 09:58
实际值差多少呢?
和布线,以及电源的功率,电源的稳定性有关;
还有ST 芯片本身的原因 ...

随着DAC输出值的变化,ADC值也是跟着变化的,而且变化不是线性的关系。
布线我会再去检查下,基本可以排除,板上的器件不多。而且DAC输出和ADC输入相距很远。
一开始是怀疑电源的原因,在示波器上看过DAC输出时并没有对电源产生影响,而且我是在DAC输出后
延时200ms再去转换ADC的。另外我也测试我过电路上实际要用的通道ADC_Channel_15,用示波器看
这个通道的输入并没有变化,所以再去测试内部参考电压ADC_Channel_Vrefint,发现同样的问题。
而且DAC是否开启output buffer对转换值也会产生影响,我在参考文档中也没有发现AD模块与DA模块的
有关联。
我真担心是stm8本身的原因。

使用特权

评论回复
地板
desertsailor| | 2015-9-16 10:38 | 只看该作者
没遇到过这种情况,建议楼主好好检查一下电路和程序,绝大多数认为是芯片问题的最终都证实是使用者的问题。

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
pofu007 + 3
5
desertsailor| | 2015-9-16 10:39 | 只看该作者
没遇到过这种情况,建议楼主好好检查一下电路和程序,绝大多数认为是芯片问题的最终都证实是使用者的问题。

使用特权

评论回复
6
pofu007|  楼主 | 2015-9-16 11:33 | 只看该作者
desertsailor 发表于 2015-9-16 10:39
没遇到过这种情况,建议楼主好好检查一下电路和程序,绝大多数认为是芯片问题的最终都证实是使用者的问题。 ...

是的我怀疑是,软件配置上的原因可能行很大。所以先来论坛问一下,看是不是有人跟我碰到过一样的问题。
自己也在找原因。

使用特权

评论回复
7
pofu007|  楼主 | 2015-9-16 12:43 | 只看该作者
mmuuss586 发表于 2015-9-16 09:58
实际值差多少呢?
和布线,以及电源的功率,电源的稳定性有关;
还有ST 芯片本身的原因 ...

找到了原因了,在这DAC输出的routing interface配置上出了问题
// DAC电压值由PB6输出
        SYSCFG_RIAnalogSwitchConfig(RI_AnalogSwitch_4, ENABLE);
        SYSCFG_RIIOSwitchConfig(RI_IOSwitch_13, ENABLE);
改为
// DAC电压值由PB6输出
        SYSCFG_RIAnalogSwitchConfig(RI_AnalogSwitch_4, DISABLE);
        SYSCFG_RIIOSwitchConfig(RI_IOSwitch_13, ENABLE);


对RI_ADCRx的配置为ASx理解错了。
通往ADC的通路应该要关掉,被我配置成打开了,所以DAC的输出为影响到ADC的转换。

使用特权

评论回复
8
threetigher| | 2016-10-20 16:02 | 只看该作者
“stm8l15x这个封装没有外部参考电压引脚,AD和DA都采用VCC做为参考电压”

lz用的哪个型号哪个封装,我只看到某些32pin的没Vref+脚,其他都有。可以考虑更换。

使用特权

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

本版积分规则

6

主题

60

帖子

1

粉丝