打印

基于PSOC3的信号发生器(转)

[复制链接]
7092|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Go_PSoC|  楼主 | 2011-9-15 14:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
原文在这里,据说是某高校老师http://psoc.**.com/luohe2008/blog/11-08/229280_03e7d.html

本例是一个基于PSOC3的函数信号发生器,通过本例,大家可以了解DAC的使用技巧。
        PSOC3系统内置了电压输出型(简称VDAC)和电流输出型(简称:IDAC)两种DAC。图1PSOC Creator开发系统内置的DAC模组。这两种DAC除了输出模拟量的性质不同以外,其余特性和配置方法大同小异,为此本文以电压输出型为例来说明DAC的使用和配置。
        PSOC3内置的VDAC组件是8位电压输出型数模转换器。模拟电压输出范围可以从0V1.020V4Mv/bit)或从04.08V16mV/bit)。可以受硬件、软件或软件和硬件配合控制,数据源可以为CPUDMA or UDB两种方式。


从图2可以看出,VDAC主要配置参数有:Output Range Speed DataSource StrobeMode四个参数,每个参数的功能分别是:
1Output Range—模拟电压输出范围,有两个选项可供选择,分别是:0-1.020V0-4.080V。此参数允许您将两个电压范围之一设置为默认值。在运行时可以随时使用VDAC8_SetRange()函数更改范围。
1
模拟电压输出范围关系表

范围
最低值
最高值
步进大小
0V—1.020v
0.0mV
1.020V
4mV
0V—4.080V
0.0mV
4.080V
16mV


输出等式:
l
1V范围---Vout = (/256)*1.024V
l
4V范围---Vout = (/256)*4.096V
需要特别说明的是,如果选择最大输出模拟电压是4V的话,Vdda一定要选择5V。如果Vdda电压低于5V,输出模拟电压将会出错。
2Speed ---转换速度,此参数提供两种设置:“低速”和“高速”。在“低速”模式下,设置时间较慢,但是使用的工作电流较小。在“高速”模式下,电压处理速度快得多,但是代价是工作电流较大。
3DataSource—数据源,此参数选择要写入DAC寄存器的数据源。如果CPUDMA将数据写入VDAC,则选择“CPU or DMA”。如果数据直接从UDB或基于UDB的组件写入,则选择“DAC Bus”。
4 StrobeMode,此参数选择当前数据写入VDAC数据寄存器时数据是否立即写入DAC。当选择“寄存器写入”选项时,选择此模式。当选择“外部”选项时,来自UDB的时钟或信号控制数据何时从DAC寄存器写入实际DAC



实例:设计一个正弦波形信号发生器,要求电压幅度在
0—4V

波形信号发生电路有好多种,比较常见的有:DDS数字直接合成技术、RC振荡电路及单片机控制数模转换来实现等三种技术。本文将采用第三种技术来实现一个正弦波发生电路。
实现方法:将一个完整的正弦波(1个周期)离散化采样,将所得数据存储在一个数组中,然后通过VDAC顺序循环输出,即可实现波形的回放,在这里有两点需要注意:1)采样点数,即对一个完整的波形采样的点数,点数越多,波形回放时失真度越小,但影响输出波形的频率。2)输出相邻两点数据的时间间隔,时间间隔越大,输出一个完整波形所需的时间越长,输出波形的频率越小。
实现这个例程,仅需要一个VDAC和一个模拟信号pin,即可实现。具体实验过程如下:
1)
打开 PSOC Creator ,创建一个项目,命名为PSOC3-DAC;

2)
创建原理图,打开TopDesign.cysch,放置一个Voltage DAC (放置路径:Cypress Component Catalog -–-> Analog -–->DAC—Voltage DAC (8-bit),一个(模拟)信号输出端子(放置路径:Cypress Component Catalog -–->Port and pin -–-> Analog Pin[V1.50]),先将信号输出端子水平旋转180度,然后用连线工具 VDAC的输出端与模拟信号输入端连接起来,如图3


配置如下:


Voltage DAC      
l Name:
VDAC8_1

l Output Range : 0-4.080V
l DataSource:

CPU or DMA

l StrobeMode :
Register Write



Analog Pin :

l
Name:
DAC_1

l
Type :

Analog

3)打开main.c文件,输入以下代码:
#include
int i =0;
/*定义一个变量*/

/*离散后的正弦波数据*/

unsigned int Sine[40]={

0x80,0x94,0xa7,0xb9,0xca,0xd9,0xe7,0xf1,0xf8,0xfd,

0xff,0xfd,0xf8,0xf1,0xe7,0xd9,0xca,0xb9,0xa7,0x94,

0x80,0x6c,0x55,0x46,0x35,0x25,0x18,0x0e,0x06,0x02,

0x00,0x02,0x06,0x0e,0x18,0x25,0x35,0x46,0x55,0x6c



};
/*以下是用到的函数声明*/

void Delay(uint16 Time); /*延时函数*/
void Sine_Wave();
/*正弦波函数*/

/* ========================================

*

* 项目名称:波形信号发声器

* 功能描述:实现一个正弦波形信号发生器

*
者: 万选明

* 完成时间:2011815

*
注:

* ========================================*/
void main()
{

/* 波形信号发生器 */

VDAC8_1_Start();
/*启动DAC*/

VDAC8_1_SetSpeed(VDAC8_1_HIGHSPEED) ; /*设置转换速度为高速*/

VDAC8_1_SetRange(VDAC8_1_RANGE_4V) ;
/*转换电压输出范围*/

while(1)

{

Sine_Wave();
//输出正弦波

}
}
/* ========================================

*

* 函数名称:void Sine_Wave()

* 功能描述:正弦波函数

*
;

*
回:无

* 完成时间:2011815

*
注:

* ========================================*/
void Sine_Wave()
{

for (i=0;i<40;i++)

{

VDAC8_1_SetValue(Sine);

}
}
5编译和调试,连接硬件,将编译后的程序下载到PSOC开发板,将开发板上的电源选择开关拨在5V的位置,用接插线将P0.0和示波器连接好,通电观察示波器上的现象,是不是一个很漂亮的正弦波形呈现在您的面前?图5是本人捕获到的实验现象,是不是跟您的一样啊?






到这一步,相信很多朋友已经明白了波形发生器的工作原理,我们用同样的办法也可以实现诸如方波、三角波、锯齿波等多种波形信号发生器。下面给出这三种波形的实验程序代码,感兴趣的朋友可以动手试一试。待我们以后学习了键盘电路以后,我们将这几个函数关联起来,实现任意波形信号发生器。
/* ========================================
* 函数名称:void Sawtooth_Wave()
* 功能描述:锯齿波函数
*
;
*
回:无
* 完成时间:2011815
*
注:
* ========================================*/
void Sawtooth_Wave()
{

for(i=0;i<255;i++)
    {
     VDAC8_1_SetValue(i);   /* 输出波形 */
    }
}
/* ========================================
* 函数名称:void Triangle()
* 功能描述:三角波函数
*
;
*
回:无
* 完成时间:2011.8.15
*
注:
* ========================================*/
void Triangle()
{

for(i=0;i<255;i++)
    {
     VDAC8_1_SetValue(i);   /* 输出波形 */
    }

for(i=255;i>0;i--)
    {
     VDAC8_1_SetValue(i);   /* 输出波形 */
    }
}
/* ========================================
* 函数名称:void Square_Wave()
* 功能描述:方波函数
*
;
*
回:无
* 完成时间:2011.8.15
*
注:
* ========================================*/

void Square_Wave()
{
VDAC8_1_SetValue(255);   /* 输出高电平 */
Delay(5);
VDAC8_1_SetValue(0);   /* 输出低电平 */
Delay(5);
}
/* ========================================
* 函数名称:void Delay(int8 Time)
* 功能描述:延时
*
; time--yan时时间
*
回:无
* 完成时间:2011327
*
注:
* ========================================*/

void Delay(uint16 Time)
{

int i=0,j=0 ;

for(j=0;j
     {

for (i=0;i<100;i++);
     }
}


沙发
yufe| | 2011-9-15 16:09 | 只看该作者
不错,支持

使用特权

评论回复
板凳
加班加点| | 2011-9-16 22:54 | 只看该作者
这么不错的波形

使用特权

评论回复
地板
傳說勝劍| | 2011-9-17 11:30 | 只看该作者
做个标记

使用特权

评论回复
5
zhuww| | 2011-9-19 10:14 | 只看该作者
通俗易懂啊

使用特权

评论回复
6
msp430ing| | 2011-9-30 16:58 | 只看该作者
楼主用的示波器太破

使用特权

评论回复
7
Go_PSoC|  楼主 | 2011-9-30 22:28 | 只看该作者
6# msp430ing
这是我转的,我的还不见得有这么好呢,呵呵

使用特权

评论回复
8
feiyefeiye| | 2012-7-5 19:07 | 只看该作者
怎么控制频率呢

使用特权

评论回复
9
PSoC小子| | 2012-7-5 20:29 | 只看该作者
**写得不错,简单易懂。
但是用 for 循环做波形发生器会占用 CPU 大量的带宽。
最好还是用 DMA 把采样值不断地输送到 DAC。这样 CPU 就解放了,而且频率容易控制。

使用特权

评论回复
10
youhandan| | 2014-4-10 16:48 | 只看该作者
怎么获得的离散数据啊?用matlab?

使用特权

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

本版积分规则

898

主题

5336

帖子

15

粉丝