本帖最后由 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;
}
|