tag 标签: SPI串行协议

相关博文
  • 热度 17
    2017-5-23 22:21
    4214 次阅读|
    0 个评论
    最近由于毕业论文的事,小编是忙的不可开交,今天抽出点时间写篇文章,冒个泡,以防大家把我给遗忘了,哈哈哈哈~ 言归正传,今天我们的任务是通过FPGA控制TLC549模数转换芯片(ADC)采集直流电压值,并把采集到的电压值在动态数码管上显示出来。 首先我们看看AD采集的电路原理图。动态数码管部分的电路图之前已经介绍过,大家可查看之前的信息。 诺,这就是原理图,是不是很简单,就一个TLC549芯片和两个上拉电阻,再什么也没有,也是简单的不能再简单了。既然原理图中用到了TLC549芯片,那么我们找找这个芯片的数据手册,看看手册中对这个芯片是怎么描述的。 从这两幅图中我们可以看出来,TLC549是一个8位的CMOS模数转换芯片(ADC),其与微控制器之间是SPI通信。我们从第二幅图中可以看出来,在读数据的时候,首先将CS信号拉低,然后8位数据的最高位在时钟的低电平期间可读出来,剩下的6位数据在时钟的下降沿输出。并且从图中可以看出来,TLC549的最大IO CLOCK的频率不超过1.1MHz。 既然通过数据手册知道了TLC549芯片的特性,下面我们开始编写TLC549驱动模块的FPGA程序,在编写程序的时候,我们需要考虑以下几个问题: 1,TLC549芯片是串行通信,那么读数据时序怎么产生? 2,如何控制TLC549芯片开始采集数据? 3,如何判断TLC549芯片数据采集完成? 4,采集完成的数据以什么方式传递给下一个模块? 对上面这几个问题,小编试着给大家分析分析,如有不对,请大家多多指正哟~ 这四个问题对于学过的单片机同学不难,用个for循环再加个延时函数就完成的事,可是在FPGA中不是这么简单。FPGA是纯数字电路,对于以上四个问题,我们需要已电路的知识来解决。 首先,对于读数据的时序,我们通过状态机的方式来实现,第一个状态时钟线拉高,第二个状态时钟线拉低,依次循环下去,可得到这个时序。对于开始采集数据的控制,我们用一根start信号线来控制,给TLC549驱动模块一个start信号,该模块接收到start信号之后,开始读数据,读完数据之后用一根ready信号线来指示数据读取完成,下一个模块接收到该ready信号时,开始读取TLC549驱动模块得到的8位数据,该数据以并行的方式传递给下一个模块。 已上是解决这四个问题的思路,下面我们贴出该驱动模块的电路符号图,由于该部分代码过长,就不全部贴出来了,感兴趣的同学可以给小编发信息,小编会把全部工程文件发给你哟~,小编的微信公众号是“xiaomage_group”。 下图是用示波器捕捉到的实际波形,从图中可以看出时钟信号的频率为500kHz,满足时序要求。 我们将从TLC549中得到的8位数据进行处理,转换成实际的电压值并显示出来。首先将该数据扩大100倍,然后分离出百位、十位、各位,将分离出的数据在动态数码管上显示出来,在显示的过程中,将小数点加在百位后面,此时数码管上显示的数据即为实际的电压值。 下图为控制模块的电路符号图,控制模块实现了对TLC549开始转换数据的控制以及查询是否采集完成,并把采集到的数据进行处理。 由于该系统的所有代码过于太长,所以不一一全部贴出来了,下面只贴出整个系统的框图。再次强调一下,感兴趣的同学可以给小编发信息,小编会把全部工程文件发给你哟~,小编的微信公众号是“xiaomage_group”。 这就是整个系统的框图,所有的电路符号的电气连接都在这里。 程序设计完毕之后,下面我们将程序下载入FPGA电路板中,看看实际的效果怎么样,会不会将实际的电压在数码管上显示出来。 通过图片的展示,可以看出我们该设计最终完成了当初的设计要求,实现了相应的功能,小编也是很开心啊,哈哈哈哈~ 更多详细内容请大家关注微信公众号“xiaomage_group”查看哟~