单片机/MCU论坛
直播中

jf_28520649

未满1年用户 8经验值
擅长:EDA/IC设计
私信 关注
[问答]

怎么利用C51、ADC0809、DAC0832制作一个积分器呢?测试发现示波器波形不对

QQ截图20231025101512.png利用ADC0809和DAC0832进行数模模数转换,如何对ADC0809转换后的数据操作实现积分操作呢,自己写的程序代码如下:

#include 

#include "Delay.h"

#include "intrins.h"

sbit START=P1^0;

sbit EOC=P1^1;

sbit OE=P1^2;

int getdata,temp,sum,real,out;

//unsigned int temp,i;

void main()

{

Delay(100);

START=1;

EOC=1;

OE=0;

while(1)

{

START=0;

_nop_();

START=1;

_nop_();

START=0;

while(EOC==0);

OE=1;

getdata=P0;

OE=0;

temp=getdata;

real=temp-127;

if(real>=0)

{

sum=sum+real;

}

else if(real < 0)

{

sum=sum-real;

}

out=sum+127;

if(out<0)

{

P2=0;

}

else if (out>255)

{

P2=255;

}

else

{

P2=out;

}

}

}

这样测试发现示波器波形不对,没有效果LR_JWX(01PAH9W2O1EUD_tmb.jpg

蓝色是输入到ADC的波形,黄色是DAC输出波形。

已退回3积分

回帖(3)

阿信509

2023-10-30 16:42:36
ad和da程序分别调试好,然后在结合算法,这样你就知道问题出在哪里
2 举报

卢表镜

2023-10-31 10:46:02
#include
#include

sbit START=P1^0;
sbit EOC=P1^1;
sbit OE=P1^2;

unsigned int getdata, temp, sum, real, out;

// DAC0832写入数值
void writeDAC(unsigned char val)
{
    P2 = val;
    P1_1 = 1;
    P1_1 = 0;
}

// 积分函数
void integrate()
{
    int i;
    for(i=0; i<50; i++) {
        START=1;
        START=0;
        while(EOC==0);
        OE=1;
        getdata=P0;
        OE=0;
        temp=(unsigned int)getdata;
        // 将ADC0809的输出转换为-5~5V的实际电压
        real=temp*1.238-626;
        // 将实际电压进行离散积分,假设采样周期为1ms
        sum += real;
        out = sum * 2.5 / 255;
        // 将积分结果输出到DAC0832,控制输出电压
        writeDAC(out);
        // 延时1ms
        Delayms(1);
    }
}

void main()
{
    // 初始化
    START=1;
    EOC=1;
    OE=0;
    sum = 0;
    // 不断积分
    while(1) {
        integrate();
    }
}
2 举报
  • jf_28520649: 非常感谢,但是这个程序写出来感觉计算的是平均值,我发到3楼
  • jf_28520649: 感谢,但是这个写出来,测试感觉不太对,图我放下面了

jf_28520649

2023-11-1 10:18:03
黄色是输出信号,蓝色是输出100Hz,0-5V正弦信号
举报

更多回帖

发帖
×
20
完善资料,
赚取积分