找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机+TLC5628正弦波发生器代码与Proteus仿真图

[复制链接]
跳转到指定楼层
楼主
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

利用已知器件完成一个简易信号发生器的设计。
二、设计内容
请利用你熟悉的单片机和8路输出串行8位D/A转换器TLC5628设计一个锯齿波信号发生器,相关TLC5628资料请自行检索资料,设参考电压,电源电压,运算放大器型号任意。
设计要求及指标: (1)输出幅度。
                          (2)输出频率之间任意。
            (3)画出设计简略电路。
四、设计步骤
1.通过TLC5628引脚图以及逻辑功能图,设计出符合要求的电路图(通过protus仿真)
电路图设计结果:
2.程序设计,通过TLC5628参数资料中的时序仿真,设计出产生锯齿波的程序
程序如下:
#include <reg52.h>
#include <intrins.h>
/*定义I/O端口*/
sbit CLK = P0^0; //串行时钟,下降沿有效
sbit DAT = P0^1; //串行数据
sbit LOAD = P0^7; //串行数据加载,下降沿有效
sbit LDAC = P0^3; //DAC更新锁存控制,下降沿有效
/*函数申明*/
void delayms(unsigned char ms);
void TCL5620_Write(unsigned char addr, bitrng, unsigned char dat);
void Init_TLC5620();
void jichiWave();
void delay5us(void);   //误差 0us
/*函数定义*/
/*延时函数*/
void delayms(unsigned char ms)
{
       unsignedchar i;
       while(ms--)
       {
              for(i= 0; i < 250; i++)
              {
                     _nop_();
                     _nop_();
                     _nop_();
                     _nop_();
              }
       }     
}
void delay5us(void)   //误差 0us
{
   unsigned char a;
   for(a=1;a>0;a--);
}
/*TCL5620 driver*/
void TCL5620_Write(unsigned char addr, bitrng, unsigned char dat)
{
       unsignedchar n;
       //发送通道地址
       n= 3;
       do
       {
              DAT= (bit)(addr & 0x02);
              addr<<= 1;
              CLK= 0;
              CLK= 1;
       }while(--n!= 0);
       //发送RNG位
       DAT= rng;
       CLK= 0;
       CLK= 1;
       //发送8位DAC数据
       n= 8;
       do
       {
              DAT= (bit)(dat & 0x80);
              dat<<= 1;
              CLK= 0;
              CLK= 1;
       }while(--n!= 0);
      
       //加载数据
       LOAD= 0;
//     delay5us();
       LOAD= 1;
//     delay5us();
       LDAC= 0;
//     delay5us();
       LDAC= 1;
}
/*初始化TLC5620*/
void Init_TLC5620()
{
       DAT= 1;
       CLK= 1;
       LDAC= 1;
       LOAD= 1;
}
/*
       TLC5620转换一次大概要12.5us
       即最高80KHz
       但是用51单片机,晶振为12MHz
       最快产生一个方波为2us,即最高频率为500KHz
      
       正弦波产生函数
       用32个点
*/
void SinWave()
{
       /*根据曲线光滑来选取采样点*/
       codeunsigned char SinTab[] =
       {
        255,240,230,220,210,200,190,180,170,160,150,140,130,120,110,100,90,80,70,60,50,40,30,20,10,0
       };
       unsignedchar n;
       for(n= 0; n < 25; n++)
       {
              TCL5620_Write(0,0,SinTab[n]);
              delayms(1);
       }
}
void main()
{
       Init_TLC5620();
       while(1)
       {
              SinWave();
       }
      
}
3.烧录HEX文件
五、实验结果的仿真与验证
信号为锯齿波,符合设计要求。
六、实验总结
本系统的硬件电路非常简单,关键在于软件算法的设计。信号发生器的最重要指标就是频率的稳定性,因此,如何通过单片机来产生精确的控制信号以使频率稳定是其关键所在。本设计在程序中已设计好数据表格,每个周期的采样点数为40个。这样就将频率稳定问题转换为采样周期的精确定位问题了。
本设计采用定时器中断方式来产生精确的采样间隔,具体的算法。
首先是设定一个定时器中断的基准时间,然后将采样时间间隔,设置为定时器中断基准时间的整数倍,倍数参量可根据频率按键扫描函数的结果以及初值来确定。
D/A作为一种常见的应用电子仪器设备,传统的波形产生一般可以完全由硬件电路搭接而成,如采用555振荡电路发生正弦波、三角波和方波的电路便是可取的路径之一,不用依靠单片机。但是这种电路存在波形质量差,控制难,可调范围小,电路复杂和体积大等缺点。在科学研究和生产实践中,如工业过程控制,生物医学,地震模拟机械振动等领域常常要用到低频信号源。而由硬件电路构成的低频信号其性能难以令人满意,而且由于低频信号源所需的RC要很大。大电阻,大电容在制作上有困难,参数的精度亦难以保证。体积大,漏电,损耗显著更是其致命的弱点。一旦工作需求功能有增加,则电路复杂程度会大大增加。
利用单片机采用程序设计方法来产生低频信号,其频率底线很低。具有线路相对简单,结构紧凑,价格低廉,频率稳定度高,抗干扰能力强,用途广泛等优点,并且能够对波形进行细微调整,改良波形,使其满足系统的要求。只要对电路稍加修改,调整程序,即可完成功能升级。
(1)分析确定设计方案。在分析的过程中一定要多查资料多听取意见,尽量站在别人的肩膀上少走弯路。对所选的也大概有了一些了解,下一步就是在这样一个基础上,综合已有的资料来更透彻的分析。
(2)查阅资料。上网查资料是必不可少的,目前各大搜索引擎都推出有自己特色的搜索服务,一定要找到适合自己的东西。
(3)学习的能力。明确了问题并且分析了然后就是如何实现的问题了。这个时候学习能力显得特别的重要。如何通过自己的努力把不明白的东西搞明白,这对学习的能力有很高的要求。接着自己开始编写简单的程序来检验一下学习的效果,理论学习和工作实际紧密结合起来。
(4)要实际动手,防止眼高手底。


仿真代码51hei下载地址:
prj.zip (49.23 KB, 下载次数: 33)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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