原文在这里,据说是某高校老师http://psoc.**.com/luohe2008/blog/11-08/229280_03e7d.html
本例是一个基于PSOC3的函数信号发生器,通过本例,大家可以了解DAC的使用技巧。
PSOC3系统内置了电压输出型(简称VDAC)和电流输出型(简称:IDAC)两种DAC。图1是PSOC Creator开发系统内置的DAC模组。这两种DAC除了输出模拟量的性质不同以外,其余特性和配置方法大同小异,为此本文以电压输出型为例来说明DAC的使用和配置。
PSOC3内置的VDAC组件是8位电压输出型数模转换器。模拟电压输出范围可以从0V到1.020V(4Mv/bit)或从0到4.08V(16mV/bit)。可以受硬件、软件或软件和硬件配合控制,数据源可以为CPU、DMA or UDB两种方式。
从图2可以看出,VDAC主要配置参数有:Output Range、 Speed、 DataSource、 StrobeMode四个参数,每个参数的功能分别是:
(1)Output Range—模拟电压输出范围,有两个选项可供选择,分别是:0-1.020V和0-4.080V。此参数允许您将两个电压范围之一设置为默认值。在运行时可以随时使用VDAC8_SetRange()函数更改范围。
范围
| 最低值
| 最高值
| 步进大小
| 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,输出模拟电压将会出错。
(2)Speed ---转换速度,此参数提供两种设置:“低速”和“高速”。在“低速”模式下,设置时间较慢,但是使用的工作电流较小。在“高速”模式下,电压处理速度快得多,但是代价是工作电流较大。
(3)DataSource—数据源,此参数选择要写入DAC寄存器的数据源。如果CPU或DMA将数据写入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文件,输入以下代码:
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();
/*正弦波函数*/
/* ========================================
* ========================================*/
VDAC8_1_Start();
/*启动DAC*/
VDAC8_1_SetSpeed(VDAC8_1_HIGHSPEED) ; /*设置转换速度为高速*/
VDAC8_1_SetRange(VDAC8_1_RANGE_4V) ;
/*转换电压输出范围*/
/* ========================================
* ========================================*/
}
(5)编译和调试,连接硬件,将编译后的程序下载到PSOC开发板,将开发板上的电源选择开关拨在5V的位置,用接插线将P0.0和示波器连接好,通电观察示波器上的现象,是不是一个很漂亮的正弦波形呈现在您的面前?图5是本人捕获到的实验现象,是不是跟您的一样啊?
到这一步,相信很多朋友已经明白了波形发生器的工作原理,我们用同样的办法也可以实现诸如方波、三角波、锯齿波等多种波形信号发生器。下面给出这三种波形的实验程序代码,感兴趣的朋友可以动手试一试。待我们以后学习了键盘电路以后,我们将这几个函数关联起来,实现任意波形信号发生器。
/* ======================================== * 函数名称:void Sawtooth_Wave() * 功能描述:锯齿波函数 * 参
数; 无 * 返
回:无 * 完成时间:2011年8月15日 * 备
注:
无 * ========================================*/ void Sawtooth_Wave() {
for(i=0;i<255;i++)
{ VDAC8_1_SetValue(i); /* 输出波形 */ } } /* ======================================== * 功能描述:三角波函数 * 参
数; 无 * 返
回:无 * 完成时间: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时时间 * 返
回:无 * 完成时间:2011年3月27日 * 备
注:
无 * ========================================*/
void Delay(uint16 Time)
{
int i=0,j=0 ;
for(j=0;j
{
for (i=0;i<100;i++);
} }
|