stm32 f103Crt6, mini 板,,da通道2输出不准确

2019-07-20 13:46发布

da 通道2设置为0,,则ad采集到的数字为800多,设置为3100,ad采集到的数字为3140左右,我发现通道2设置的数字越大,ad得到的数字精准度就越高,以下是代码
这是dac通道2的代码

void dac2_init()
{
        GPIO_InitTypeDef GPIO_InitStructure;
        DAC_InitTypeDef DAC_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
       
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
       
        GPIO_Init(GPIOA,&GPIO_InitStructure);  
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC,ENABLE);
       
        if(!is_deinit)
        {
                DAC_DeInit();
                is_deinit=1;
        }
       
        DAC_InitStructure.DAC_Trigger=DAC_Trigger_None;
        DAC_InitStructure.DAC_WaveGeneration=DAC_WaveGeneration_None;
        DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude=DAC_LFSRUnmask_Bit0;
        DAC_InitStructure.DAC_OutputBuffer=DAC_OutputBuffer_Disable;
       
        DAC_Init(DAC_Channel_2,&DAC_InitStructure);
       
        DAC_Cmd(DAC_Channel_2, ENABLE);
       
        DAC_SetChannel2Data(DAC_Align_12b_R, 0);
}

void dac2_set(u16 vol) //精确度3位小数
{
        float temp=vol;
        temp/=1000;
        temp=temp*4096/3.3;
        DAC_SetChannel2Data(DAC_Align_12b_R,temp);//12位右对齐数据格式设置DAC值
}


以下是主程序

int main(void)
{       
        u16 num;
        float vol;
        delay_init();       
        LCD_Init();
        dac2_init();
        adc1_init(GPIO_Pin_2,1);
        POINT_COLOR=RED;
        DAC_SetChannel2Data(DAC_Align_12b_R,1000);
        while(1)
        {
               
                num=adc1_get(ADC_Channel_2);
                LCD_ShowxNum(60,44,num,4,16,0x80);  //所得数字
                vol=num*3.3/4095;
                num=vol*1000;
                LCD_ShowxNum(60,60,num/1000,1,16,0x80); //电压整数部分
                LCD_ShowChar(68,60,'.',16,0x80);
                LCD_ShowxNum(76,60,num%1000,3,16,0x80); // 电压小数部分
                num=DAC_GetDataOutputValue(DAC_Channel_2);  //查看da通道2的输出
                LCD_ShowxNum(60,76,num,4,16,0x80);
        }
}


这是以上代码结果

图片我传不来,,,

1631
1.315
1000



现在我来详细解释一下吧,首先,da1非常准确,误差在第3位小数,我用adc1、2、3都试过。
其次,da2如果设置数字越小,误差越大,就像上面的结果,设置1000,采集到的值是1600,误差600,,,而3100时,采集到的值为3140,误差40,设置1700是,采集到的值1800,误差是100多,,,,我用adc1、2、3都试过,发现就是不准确,,,,,,,为啥,从通道2这个函数DAC_GetDataOutputValue(DAC_Channel_2)得到的值,是设置值,而ad采集到的值却有误差呢(注意:da通道1没有误差,即DAC_GetDataOutputValue(DAC_Channel_1)值与实际采集值一致),,,,还有一点我得告诉大家,就是我的da2的代码是复制da1改过来的,所以不知道是不是代码有问题。希望大家告诉我,,,为啥,,,,
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。