找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 20552|回复: 2
打印 上一主题 下一主题
收起左侧

第10章 TLC5615数模转换器DAC

[复制链接]
跳转到指定楼层
楼主
51单片机轻松入门—基于STC15W4K系列(C语言版)
李友全
编著:http://www.51hei.com/bbs/dpj-37954-1.html


第10章 数模转换器DAC
1 D/A输出电路图
2 TLC5615基本测试实验
3 TLC5615产生波形实验
4 TLC5615播放音乐实验
数模转换就是将单片机输出的数字信号转换为模拟信号(比如正弦波、锯齿波)

简称为D/A,实现数字信号转换为模拟信号的器件称为数模转换器,简称DAC

DAC一般是由专用集成电路完成的。

1 D/A输出电路图
1号单片机与D/A输出芯片TLC5615连接电路如图所示 。

TLC5615的1、2、3脚用于与单片机进行通信(SPI接口),6脚是基准电压输入,
7脚是模拟信号输出。图中的MC1403是一个廉价的电压基准芯片,简单的说就是一 个稳压精度比L7805之类更高的稳压块
2 TLC5615基本测试实验

#include "STC15W4K.H" // 注意宏定义后面没分号

#include
sbit CS=P5^5; sbit CLK=P4^0; sbit DIN=P3^4;
void DaConv(unsigned int value)
{
// 此函数内容固定,单片机晶振频率在5-35MHz范围内直接复制使用即可
}
void main()
{
unsigned int value; // 待转换的数据
while(1)
{
value=511; // 这里输入0--1023的数据观察D/A转换输出电压 DaConv(value); // 执行D/A转换,无任何返回值。
}
}
实验结果如表所示,输出电压X = 2·Vref·Value /1023。


3 TLC5615产生锯齿波、三角波、正弦波实验

例10.4 TLC5615产生1000Hz锯齿波、三角波、正弦波,R/C时钟22.1184MHz。


观察上图波形,横轴是时间,可用单片机定时器定时中断进行控制,纵轴是模拟电压值, 用TLC5615进行D/A转换输出即可。
要让TLC5615输出锯齿波、三角波、正弦波等波形,我们可以对波形的一个周期抽样一些 点进行D/A转换输出,把抽样点建立成表格,定时器每中断一次查表转换输出一个值。

比如我们将正弦函数从0°~360°范围内按10°一个步进值进行等分,可得0、10、20、

30、…340、350,共36个点,这就确定了表格数组大小为36个整数,

第1点输出电压值:511×sin(0)+512=512 // 511用于波形向上平移。 第2点输出电压值:511×sin(10)+512=601 // 511用于波形向上平移。 第3点输出电压值:511×sin(20)+512=687 // 511用于波形向上平移。

unsigned int code SinTable[] = // 正弦波表格
{

512,601,687,768,840,903,955,992,1015,1023,1015,992,955,903,840,768,687,601,512,

423,337,257,183,121,69,32,9,1,9,32,69,121,183,257,337,423,
};
主要程序代码如下:

void Timer0() interrupt 1
{
static unsigned char counter=0;


P35=!P35;
//
观察定时器定时时间用的
TH0=0xff;
//
TH0=0xff;
TL0=0xCD;
//
TL0=0x2c;
DaConv(SinTable[counter]);
//
D/A输出
counter++;



counter%=36; // counter在0到36之间循环变化使波形循环输出
}
void main()
{
Timer0_Init(); // 初始化并启动定时器0
while(1); // 通过定时器0来控制产生电压的时间间隔
}

当需要更换输出波形时,只需要修改DaConv(SinTable[counter]);语句中的表格名称即可,实测 D/A输出波形如图10-7所示。

4 TLC5615播放音乐实验

将音乐文件(比如MP3文件)通过其它辅助软件转换成单片机内部的表格数组,然后通过不断查 表+D/A的方式即可播放出音乐,通过调节TLC5615的输入基准电压就可调节输出音量的大小。 主要代码如下:

void Timer0() interrupt 1

{

static unsigned int counter=0; TH0=0xFE;

TL0=0x33;

DaConv(((unsigned int)wav[counter])<<1); // 将wav数组中的数据扩大2倍后写入TLC5615 counter++; // 扩大2倍是为了使TLC5615的音频输出电压范围在0-2.5V之间 counter%=WAV_LEN; // counter在0到WAV_LEN-1之间循环变化使声音循环播放

}

void main()

{

Timer0_Init(); // 初始化并启动定时器0

while(1); // 通过定时器0来控制产生电压的时间间隔

}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏7 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:85598 发表于 2018-6-5 12:05 | 只看该作者
求教:“{ // 此函数内容固定,单片机晶振频率在5-35MHz范围内直接复制使用即可 }”具体内容,谢谢!
回复

使用道具 举报

板凳
ID:685385 发表于 2020-12-17 11:18 | 只看该作者
“通过其它辅助软件转换成单片机内部的表格数组,然后通过不断查 表+D/A的方式即可播放出音乐,通过调节TLC5615的输入基准电压就可调节输出音量的大小”
这个其他辅助软件什么意思?可以举个详细的例子吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表