打印
[PIC®/AVR®/dsPIC®产品]

【CuriosityNano测评报告】PIC18F16Q40之DAC正弦波输出

[复制链接]
1734|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 qjp1988113 于 2021-6-18 13:45 编辑

PIC18F16Q40带了8BIT的ADC,今天我们就来测试它。DAC的用途之一就是做成可调的直流电压。具体为DAC引脚输出,后面跟一级运放,就可以变成可调直流电压了,可以很好的节省成本。
今天我们不做直流电压,我们做一个正弦波发生器:
先配置,几乎没啥好配置的,配置好DAC,再使能一个引脚输出。

生成配置代码:

void DAC1_Initialize(void)
{
    // OE DACOUT2 Enabled and DACOUT1 Disabled; DAC1EN enabled; NSS VSS; PSS VDD;
    DAC1CON = 0xA0;
    // DAC1R 154;
    DAC1DATL = 0x9A;
}

void DAC1_SetOutput(uint8_t inputData)
{
    DAC1DATL  = inputData;
}

uint8_t DAC1_GetOutput(void)
{
    return DAC1DATL;
}
不能再简单了。我们写一个电压转成DAC值的函数:
//电压转ADC值
#define Vref  3,3                    //ADC 参考电压
#define resolution_dac  256          //DAC分辨率 BIT
float VOLTG2DACValue(float Voltg)
{
    float tmp=0;
    if (Voltg>5) return tmp;
    //转换数据
    tmp=resolution_dac*Voltg*1.0/Vref;
    return tmp;
}
我们写一个正弦波数据发生函数:
uint8_t sin_tab[128];
//直接输入DAC数据
void getSinTab(uint8_t point,uint16_t maxnum)
{
    uint8_t i=0;
    float   radian;     //弧度
    float   angle;      //角度 分度角
    angle=360.000/point;//步进角

    for(i=0;i<point;i++)
    {
        radian=angle*i;//得到角度值
        radian=radian*0.01744;//角度转弧度  弧度=角度*(π/180)
        sin_tab[i]=(maxnum/2)*sin(radian)+(maxnum/2);
    }
}
//输入电压
void getSinTabFromVoltg(uint8_t point,float Voltg)
{
    uint8_t i=0;
    uint16_t maxnum;                //DAC 值
    float   radian;                 //弧度
    float   angle;                  //角度 分度角
   
    maxnum=VOLTG2DACValue(Voltg);   //电压转成DAC值
    angle=360.000/point;            //步进角

    for(i=0;i<point;i++)
    {
        radian=angle*i;//得到角度值
        radian=radian*0.01744;//角度转弧度  弧度=角度*(π/180)
        sin_tab[i]=(maxnum/2)*sin(radian)+(maxnum/2);
    }
}
我们在main里面调用:
#define POINT 100
#define AM  1.0f
///////////////////////////////////
getSinTabFromVoltg(POINT, AM);
        while(1)
        {
            for(i=0;i<POINT ;i++)
            {
                DAC1_SetOutput(sin_tab);
                __nop();
               // __delay_us(1);
            }
        }


编译下载,查看示波器:


但是就是不加延时,100个点一个周期 最大页就是1.6K以上。做波形发生器还是不行的。
目前只能用PWM脉冲,然后RC滤波产生正弦波,理论上可以做到500K~
好了,DAC就到这了~


使用特权

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

本版积分规则

111

主题

627

帖子

2

粉丝