打印

【CuriosityNano测评报告】+ DAC生成三角波

[复制链接]
1386|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
10位DAC生成 100Hz左右的三角波
/* 4 MHz (needed for delay function) */
#define F_CPU                   (4000000UL)

#include <avr/io.h>
#include <util/delay.h>
#include <math.h>

/* 参考电压延迟 */
#define VREF_STARTUP_TIME       (50)
/* 低2位 */
#define LSB_MASK                (0x03)
/* 单周期点数 */
#define Single_Wave_Dots       (400)
/* 偏置电压 */
#define DC_OFFSET          (510)
/* 频率 */
#define FRE               (100)
/* 每个点延迟时间 */
#define Bit_Period         ((1000000 / FRE) / Single_Wave_Dots)

static void tWaveInit(void);
static void VREF_init(void);
static void DAC0_init(void);
static void DAC0_setVal(uint16_t value);

/* Buffer to store the sine wave samples */
signed int tWave[Single_Wave_Dots];
signed int tx ;
static void tWaveInit(void)
{
    uint16_t i;
    for(i = 0; i < Single_Wave_Dots; i++)
    {
        if(  i>99 && i <300){
        tx = 200-i ;
        }
               
        if (i >299){
        tx = i-400 ;
        }
         if (i >0 && i <100 ){
        tx = i ;
        }
        tWave[i] = DC_OFFSET + tx*5;
    }
}

static void VREF_init(void)
{
    VREF.DAC0REF = VREF_REFSEL_2V048_gc /* Select the 2.048V Internal Voltage Reference for DAC */
                 | VREF_ALWAYSON_bm;    /* Set the Voltage Reference in Always On mode */
    /* Wait VREF start-up time */
    _delay_us(VREF_STARTUP_TIME);
}

static void DAC0_init(void)
{
    /* Disable digital input buffer */
    PORTD.PIN6CTRL &= ~PORT_ISC_gm;
    PORTD.PIN6CTRL |= PORT_ISC_INPUT_DISABLE_gc;
    /* Disable pull-up resistor */
    PORTD.PIN6CTRL &= ~PORT_PULLUPEN_bm;
    DAC0.CTRLA = DAC_ENABLE_bm          /* Enable DAC */
               | DAC_OUTEN_bm           /* Enable output buffer */
               | DAC_RUNSTDBY_bm;       /* Enable Run in Standby mode */
}

static void DAC0_setVal(uint16_t value)
{
    /* Store the two LSbs in DAC0.DATAL */
    DAC0.DATAL = (value & LSB_MASK) << 6;
    /* Store the eight MSbs in DAC0.DATAH */
    DAC0.DATAH = value >> 2;
}

int main(void)
{
    short tindex = 0;
   
    VREF_init();
    DAC0_init();
   
    tWaveInit();
   
    while (1)
    {
        DAC0_setVal(tWave[tindex++]);
        if(tindex == Single_Wave_Dots)
            tindex = 0;
        _delay_us(Bit_Period);
    }
}





使用特权

评论回复
沙发
xuanhuanzi| | 2020-8-12 19:58 | 只看该作者
看起来很纯正的波形。

使用特权

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

本版积分规则

个人签名:32MCU单片机查询网 http://www.32mcu.com MCU选型,嵌入式设计辅助,选择最适合的MCU

35

主题

173

帖子

143

粉丝