此时此刻 在心里默默的问自己一下  是不是个傻X  后天就考检测了  作为从来没听过一节课的我  现在还没看多少 却想着这个破玩意   哎     不过还是大概的翻了一下课本  其实有点后悔没听课 仔细看了一下  书里面的东西还是挺有用的  并且和自控  模电有大量的联系 更加坚信了一点  所有的学科都不是独立存在的  真的是一个相互联系的有机整体 如果正在上大学的你看到 请坚信  大学里面学到的那些理论真的很有用! 哈哈哈  纯属个人扯淡淡  不喜勿喷

进入正题:

TLC5615 产生频率可变的正弦波和三角波

三角波直接在最后附上代码

在大一的时候写过这个5615的基本程序  就是给个数字量 输出一个简单的模拟量  那之后没有深入下去管他  当时更不知道SPI这个冬冬    现在重新再学一下      昨天是做了一个产生正弦的波形可是  频率不可调 其实这样意义不大 所以决定做一下频率可调的用5615   直接这样说 :

利用中断  假设我们采样的点数是128个  每次进入中断  我在中断里面向5615写一个正弦表里面的值 这样进入128次中断即可写完一个周期的正弦波形  自然而然 这个波形的周期 就位128*中断时间    这样我们只要改变进入中断的时间即可改变输出正弦波形的周期  依据这个理论思想固然没有错 但是请注意:

1:如果我们把写函数  Write_TLC5615(sine[n++]);  放在中断里面  下面我把这个函数贴出来

void  Write_TLC5615(uint date)
{
    uint i;
TLC5615_SCLK=0;
TLC5615_CS=0;
date<<=6;
for(i=0;i<12;i++)
{
TLC5615_DIN=(bit)(date&0x8000);
TLC5615_SCLK=1;
date<<=1;
TLC5615_SCLK=0;
}
TLC5615_CS=1;
TLC5615_SCLK=0;
}

这是向5615写入数据的函数  我们以89c52单片机为例   如果你学过汇编  就应该大概知道  写一个数据也就是执行一遍这个写函数需要执行的指令周期是多少  这里我们设他为100US  (虽然我不太会汇编  应该差不太多吧 哈哈)

也就是说 即使我们不放在中断里面 放在主函数的while(1)里面全速的写 128个点的话 128*100 也要12.8ms  也就是说你最大产生的频率还不到100HZ  (这里我们假设的那段代码100US哈) 所以即使你产生可变频率的正弦波也只是100HZ以下的可变正弦波   但是请注意  这个函数是有执行时间的  也就是说我们把他放在中断里面 你进入中断的时间绝对不能大于中断里面代码的执行时间   !!!!!

我在百度这个资料的时候看到过这样一个问题  这里贴出来  供我们一起体会 

其实这个问题 我个人觉得就是上面我们所说的问题 无论你进入中断的速度有多快  你取得点数和你写函数写一个点执行的时间 两者的乘积决定了你正弦频率的最大值   OK?

2:这里顺便说一下那128个正弦表的点到底是如何得到的!

首先这里的128不是固定的 使我们自己认为设定的  你可以设定68个 或者1024或者别的 但是不要太大也不要太小   至于为什么 自己思考吧   哈哈  那么 这里我们还是以128个点来说明这里的128个正弦表的数值是如何计算出来的 首先无论你去多少点 正弦的一个周期走过的角度都是360度   那个128个点的话   每个点所占据的地盘是360/128   将这个值幻化成弧度制  就是  度数*π/180    用sin 求出来这点正弦值  用这个值成衣我们DA转换的最大输入数字量的一半+在加上这个最大输入量的一半  至于为什么这么做  简单说一下  因为我们的参考电压为正值  虽然是个正弦波但是我们也不能输出来负值 这点是由我们的硬件决定的 最大值的一半就相当于我们常见正弦波的那个X轴的0 就是给这个波形找了一个参考“零点”  仔细想一下  太懒了 不做太详细的说明 下面 我附上我计算正弦表的一段C语言代码  大家仔细体会思考一下   VC++6.0运行即可得到128个正弦点 直接付给DA转换即可

# include "stdio.h"
# include "math.h"
# define max 800
int A[128]={0};//用来存放正弦表
void main()
{
int i=0; 
double a,b;   //a:角度 b:弧度
a=360.000/128; 
for(i=0;i<128;i++)
{
b=a*i*0.01744; //角度转弧度  弧度=角度*(π/180)
A[i]=(int)((max/2)*sin(b)+(max/2));
printf("%d,",A[i]);
}
}

3:大家看上面的代码 最大值我并没有取1024    这是因为如果TLC5615的最大值1024 带入上段的代码中 你会发现 在输出电压上的峰值上会有那么一点失真  此时参(参参考电压是2.5V)按理来说最大可以输出5V  但是 根本到不了 4.8左右吧  这个我也不知道为什么  把 1024改小点 或者稍微增大一点参考电压应该就没问题了

4:下面我附上代码和仿真电路图 代码中我只取了90个点  按键是用来改变进入中断的时间的 也就是用来调整正弦波频率的  按键按下的时候可以明显看到正弦波形的频率增大  声明一下 没有实物验证 没有实物验证 没有实物验证  !!

但是理论上大概是这样

#include<reg52.h>
# include"math.h"
#define   uint  unsigned int
#define   uchar unsigned char
uint    code sine_dot1[90]=
{400,427,455,483,510,536,562,587,611,634,656,677,697,715,731,746,759,770,780,788,793,797,799,799,797,794,788,780,771,759,746,731,715,697,678,657,635,612,588,563,537,511,484,456,428,400,373,345,317,290,264,238,213,188,165,143,122,103,85,69,54,41,29,19,12,6,2,0,0,2,5,11,19,28,39,52,67,83,101,120,141,163,186,210,235,261,287,315,342,370
};
sbit TLC5615_SCLK=P2^4;
sbit TLC5615_CS=P2^5;
sbit TLC5615_DIN=P2^6;
sbit K=P1^2;
int num=1000;
void delay(uint k)
{                      uint i,j;for(i=11;i>0;i--)for(j=k;j>0;j--);
}
void  Write_TLC5615(uint date)
{uint i;TLC5615_SCLK=0;TLC5615_CS=0;date<<=6;for(i=0;i<12;i++){TLC5615_DIN=(bit)(date&0x8000);TLC5615_SCLK=1;date<<=1;TLC5615_SCLK=0;          }TLC5615_CS=1;TLC5615_SCLK=0;}
void init()
{  TMOD=0x01;   TH0=(65536-num)/256;  TL0=(65536-num)%256;  EA=1;  ET0=1;  TR0=1;
}
void Key()
{if(K==0){delay(10);while(!K);num+=1000;if(num==20000)num=1000;          }
}void main()
{init() ;while(1){Key();    }
}
void T0_Time() interrupt 1
{  int n;TH0=(65536-num)/256;  TL0=(65536-num)%256;  Write_TLC5615(sine_dot1[n++]);if(n>=90) n=0;
}

三角波代码

#include<reg52.h>
#define   uint  unsigned int
#define   uchar unsigned char
sbit TLC5615_SCLK=P2^4;
sbit TLC5615_CS=P2^5;
sbit TLC5615_DIN=P2^6;
sbit K1=P1^0; //K1  K2分别用来控制幅值的增减
sbit K2=P1^1;
sbit K3=P1^2;//K3  K4用来 控制频率的增减
sbit K4=P1^3;
uint num1=0,num2=0;
void Delay_Mms(uint k)
{                      uint i,j;for(i=113;i>0;i--)for(j=k;j>0;j--);
}
void Dleay_Nus(uint u)
{for(u;u>0;u--);
}
void  Write_TLC5615(uint date)
{uint i;TLC5615_SCLK=0;TLC5615_CS=0;date<<=6;for(i=0;i<12;i++){TLC5615_DIN=(bit)(date&0x8000);TLC5615_SCLK=1;date<<=1;TLC5615_SCLK=0;          }TLC5615_CS=1;TLC5615_SCLK=0;}  void Key()
{if(K1==0){Delay_Mms(10);while(!K1);  num1+=10; //num1增加或者减少 相应的幅值就增加或者减少  这里 选择增量为10  是为了更好的看到效果 if(num1==1000)      //num1的值越小幅值增加越小  下面的num2和这个一样num1=0;          }if(K2==0){Delay_Mms(10);while(!K1);if(num1>=10){num1-=10;}if(num1<10)num1=0;            }if(K3==0){Delay_Mms(10);while(!K3);num2+=10;if(num2==1000)num2=0;           }if(K4==0){Delay_Mms(10);while(!K4);if(num2>=10){num2-=10;}if(num2<=10)num2=0;          }}void main()
{uint n;while(1){for(n=0;n<100;n++){Write_TLC5615(n+num1);Dleay_Nus(num2);   }for(n=100;n>0;n--)//这里的判定条件曾经写的n>=0;  有兴趣可以试试  出来的波形完全不一样  至于为什么  自己想吧{Write_TLC5615(n+num1);Dleay_Nus(num2); } Key();    }
}

今天差不多就学习这么多  前面的文章中 有对TLC5615的其他一些基本介绍  有兴趣可以看看

http://blog.csdn.net/hopesunice/article/details/77726465

学艺不精  错误之处应该很多  欢迎一起学习 哈哈哈哈

TLC5615 产生频率可变的正弦波相关推荐

  1. FPGA产生频率可控的正弦波

    参看原文: FPGA学习(一)--产生频率可控的正弦波 - 子木的文章 - 知乎 https://zhuanlan.zhihu.com/p/36929424 2018.5.17更新如下 作为小透明,没 ...

  2. python正弦波叠加方波_无穷多个(幅值)和(频率)不等的正弦波叠加就能形成周期方波。_学小易找答案...

    [简答题]请上传撰写的演讲稿 (30.0分) [单选题]被称为"信息化的第一场战争"的是() [简答题]编程题 1 .编写一个 C 程序 , 从键盘上输入任意两个整数 , 输出他们 ...

  3. verilog设计简易正弦波信号发生器_FPGA学习(一)——产生频率可控的正弦波

    2018.5.17更新如下 作为小透明,没想到随手一写的学习过程也能被看见,看到有人点赞也还是很高兴的,希望能以后自己忘了,还能来看懂,如果对大家能有所帮助,那就再好不过了. 对于输出的正弦波周期有两 ...

  4. 模拟电子技术实验指导书

    前             言 本书是根据当前本科.大专.高职.高专等各类学校的电子技术教学和实验的需要,结合我公司生产的RTDZ系列电子技术实验装置的性能.指标编写而成,与我公司的产品配套使用,不做 ...

  5. 电力电子技术课程实验:实验二、可控整流电路及pwm逆变电路设计、制作、测试

    电力电子技术课程实验:实验二.可控整流电路及pwm逆变电路设计.制作.测试 第一部分.可控整流电路预习报告 一.知识准备 1.1.三相桥式全控整流电路的构成及其工作原理 1.2.三相桥式全控整流电路对 ...

  6. 可变频率正弦信号发生器的FPGA实现(Quartus)

    一.说明 实现平台:Quartus17.1.MATLAB2021a和Modelsim SE-64 10.4 二.内容 1. 产生一个完整周期的正弦波信号,并保存为*.mif文件; 2. 设计一个ROM ...

  7. 十三届蓝桥杯嵌入式输出比较(频率和占空比可变)

    目录 原理说明: CUBMAX初始化: 代码实现: 问题和注意事项: 引用的文章: 原理说明:​​​​​​​ 输出比较模式下: CCR = CNT 时,翻转输出电平. PWM模式下: CNT < ...

  8. 74ls390设计任意进制计数器_利用数字频率合成技术设计高速任意波形发生器(上)...

    波形发生器为常用器件,正因如此,波形发生器具备较强现实意义.对于波形发生器,诸多朋友均存在一定兴趣.此外,小编在往期带来诸多波形发生器相关文章,热爱波形发生器的朋友可翻阅哦.本文中,小编对于波形发生器 ...

  9. 零中频接收机频率转换图_复数RF混频器零中频架构及高级算法:下一代SDR收发器中的黑魔法...

    RF工程常被视为电子领域的黑魔法.它可能是数学和力学的某种奇特组合,有时甚至仅仅是试错.它让许多优秀的工程师不得其解,有些工程师仅了解结果而对细节毫无所知.现有的许多文献往往不建立基本概念,而是直接跳 ...

  10. 数字频率、模拟频率、角频率的区别

    背景 我们都知道,正弦信号和复指数信号是信号处理中非常重要的2大工具. 正弦序列定义为: x(n)=Acos(wn+φ)x(n)=Acos(wn+\varphi) x(n)=Acos(wn+φ) 其中 ...

最新文章

  1. HashMap和Hashtable及HashSet的区别
  2. Linux真随机数的生成
  3. 技术总监反思录:我是怎么失去团队掌控力的?
  4. CAS权属线粗细修改
  5. JSR311发布Restful WebService工程
  6. 为什么发了个博客分分钟被各种网站花式转载=。=而不通知我
  7. 基于springboot高校社团管理系统
  8. 什么是工业DTU?工业DTU特点及应用领域分析
  9. python pip 换源_Python pip换源教程
  10. fabio docker
  11. MacBookPro恢复出厂系统
  12. instagram封号的原因解析
  13. 微信公众号-java上传图片素材到微信服务器基于事件推送两条消息
  14. 【USB】USB video class (UVC)相关概念学习
  15. 百度地图--展示行政区划(省市区县)和添加多个标注点案例
  16. 我经历过的失败产品和项目(四):没有落单的多媒体彩铃媒体服务器
  17. ai怎么画路线_AI入门教程!怎样画出专业又艺术的几何线条图案
  18. 勇芳VFB的Miniblink组件实现文件下载
  19. Win10打开游戏提示需要新应用打开此ms-gamingoverlay的解决方法
  20. 丛林战争项目十之数据库查询

热门文章

  1. 【渝粤题库】陕西师范大学200461英语阅读(一) 作业(高起专、高起本)
  2. 金蝶eas怎么引出凭证_金蝶KIS软件操作技巧/百问百答
  3. 第46届EC-Final总结
  4. IJCAI 2022杰出论文公布,大陆作者中稿298篇拿下两项第一
  5. java订单超时取消设计_订单超时30分钟自动取消
  6. vue 前端仿QQ截图实现Web端自定义截屏(JS版)
  7. 刷题时遇到的经典解法(实时更新)
  8. [ZT]一位美眉出差到深圳,被黑心的出租车司机绕路不说,而且把妹妹扔在路边,带着她的行李就跑了。...
  9. linux离线安装sails,关于sails 初学者常见问题汇总(示例代码)
  10. 免费压缩视频大小最佳方法?