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改过来的,所以不知道是不是代码有问题。希望大家告诉我,,,为啥,,,,
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>