3回答

0收藏

[原创] PSoC3 FirstTouch Starter Kit 之VDAC应用正弦波

英飞凌 英飞凌 3986 人阅读 | 3 人回复 | 2012-10-13

这次首先来张效果图

这次也还是利用了之前用到过的VDAC组件
只是具体增加了定时器中断

定时器的设置
1 首先是外部时钟

2 其次是定时器的设置

注意 我启用了计数中断
isr_1 的中断函数

注意 在中断函数中调用了 Timer_1_ReadStatusRegister();
用于清除中断标志变量  如果没有这句话的话 会导致定时间隔出现极大的误差 这个我也请教了好多人才知道的
可以看到一些时钟


主函数中

const uint8 sinArray[256] =
{
        128,        131,        134,        137,        140,        143,        146,        149,
        152,        155,        158,        162,        165,        167,        170,        173,
        176,        179,        182,        185,        188,        190,        193,        196,
        198,        201,        203,        206,        208,        211,        213,        215,
        218,        220,        222,        224,        226,        228,        230,        232,
        234,        235,        237,        238,        240,        241,        243,        244,
        245,        246,        248,        249,        250,        250,        251,        252,
        253,        253,        254,        254,        254,        255,        255,        255,
        255,        255,        255,        255,        254,        254,        254,        253,
        253,        252,        251,        250,        250,        249,        248,        246,
        245,        244,        243,        241,        240,        238,        237,        235,
        234,        232,        230,        228,        226,        224,        222,        220,
        218,        215,        213,        211,        208,        206,        203,        201,
        198,        196,        193,        190,        188,        185,        182,        179,
        176,        173,        170,        167,        165,        162,        158,        155,
        152,        149,        146,        143,        140,        137,        134,        131,
        128,        124,        121,        118,        115,        112,        109,        106,
        103,        100,        97,        93,        90,        88,        85,        82,
        79,        76,        73,        70,        67,        65,        62,        59,
        57,        54,        52,        49,        47,        44,        42,        40,
        37,        35,        33,        31,        29,        27,        25,        23,
        21,        20,        18,        17,        15,        14,        12,        11,
        10,        9,        7,        6,        5,        5,        4,        3,
        2,        2,        1,        1,        1,        0,        0,        0,
        0,        0,        0,        0,        1,        1,        1,        2,
        2,        3,        4,        5,        5,        6,        7,        9,
        10,        11,        12,        14,        15,        17,        18,        20,
        21,        23,        25,        27,        29,        31,        33,        35,
        37,        40,        42,        44,        47,        49,        52,        54,
        57,        59,        62,        65,        67,        70,        73,        76,
        79,        82,        85,        88,        90,        93,        97,        100,
        103,        106,        109,        112,        115,        118,        121,        124
};

extern uint8 timerflag;
void main()
{
    /* Place your initialization/startup code here (e.g. MyInst_Start()) */
       
        // VDAC test
        uint8 count = 0;
        uint8 timercount = 0;
        CYGlobalIntEnable;
        VDAC8_Start();
        VDAC8_SetSpeed(VDAC8_HIGHSPEED);
        VDAC8_SetRange(VDAC8_RANGE_1V);
       
        isr_1_Start();
        Timer_1_Start();
        while(1)
        {
               
                if(timerflag)
                {
                        // 100us
                        timerflag = 0;
                        timercount++;
                        if(timercount == 10)
                        {
                                // 1ms
                                timercount = 0;
                                VDAC8_SetValue(sinArray[count]);          // 50/255* 4.080 = 0.8V
                                count += 1;
                                if(count == 256)
                                count = 0;
                                // T = 1ms * 256 = 256ms
                        }
                }
                else
                {
                       
                }
               
        }
       
}

sinArray 存储了我自己计算出来的正弦波数据

关于VDAC的输出电压 虽然说可以设置为4V的 但是由于我们采用的是3.3V的电源 最大也只能输出到3.3V
因为为了能够显示出正弦波的样子而没有出现截断,我用的是1V满幅输出

这种方法虽然实现了正弦波输出 但耗费了CPU大量的运算能力
可以看出本来周期应该是256ms 但由于一些延时 ,周期约为270ms
一些论坛上说应该使用DMA 我还没试



分享到:
回复

使用道具 举报

回答|共 3 个

倒序浏览

沙发

Go_for_it

发表于 2013-5-24 12:09:15 | 只看该作者

请问楼主是否试过产生1kHz的正弦波,我咋弄都不行,最多700Hz。我是200个数据,5us的定时,出来只有700HZ左右
板凳

w932443004

发表于 2013-5-24 23:17:49 | 只看该作者

海日生明月 发表于 2013-5-24 12:09
请问楼主是否试过产生1kHz的正弦波,我咋弄都不行,最多700Hz。我是200个数据,5us的定时,出来只有700HZ左 ...

忘掉了呢 不好意思哈
地板

Go_for_it

发表于 2013-5-25 08:37:07 | 只看该作者

wangku001wei 发表于 2013-5-24 23:17
忘掉了呢 不好意思哈

频率高了不行,并且500Hz的时候还会影响ADC,液晶显示一直不正常,纠结的很
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条