这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » anmko的进程贴:综合实验-基于DS1302的万年历LCD1602显示(最终版

共76条 5/8 |‹ 3 4 5 6 7 8 跳转至
高工
2012-10-15 19:29:41     打赏
41楼
14、TLC549的AD转换实验
        这几天很懒撒什么也不想做。。。拖沓了好几天。。终于摆正心态干点事了。颓废是中很危险的状态啊。
        
        看了一上午的TLC549的时序,终于初步把AD给调试出来了,为什么说是初步呢,因为我没对AD转换进行滤波、多次转换求平均等处理,纯粹是把单次转换值在数码管上显示出来,
单次的AD准换在实际应用中是没任何意义的,所以下一步就是准备滤波、求平均,让得到的数据有实际意义。



        数码管中C8是AD准换的量化值(16进制),C8换算成10进制是200;
        AD转换的参考电压是2.45V(应该是2.5V的,但是我用万用表测得是2.45V);
        数码管中192是电压值(单位10mv);
所以:
       192=200*245/255

视频

视频地址:http://union.bokecc.com/flash/player.swf?vid=A57963AA62A59C9C&siteid=290666218ACBA694&playerid=EEA982EE6B20F4D1&playertype=1


sof、pof下载(晶振是Y1):
——回复可见内容——

高工
2012-10-15 21:10:56     打赏
42楼
慢慢来,不用着急

高工
2012-10-17 20:54:30     打赏
43楼
今天特懒,,晚上什么都没干。。。。

高工
2012-10-18 19:48:18     打赏
44楼
可以改的,在1楼有设置选项的

高工
2012-10-19 22:48:58     打赏
45楼

我都不好意思了。。


高工
2012-10-20 17:26:53     打赏
46楼

15、TLC549AD转换时序详解(源代码注释)
       了解一个芯片的功能应该看它的参数,应用一个芯片你就得认真的去读懂它的时序图。
改进了上次的实验,加入了256的8位的缓存,并求平均。

          由图1、图2可知道 :
1、f(ioclk)max=1.1MHz。
2、t(su)min=1.4us。
3、t(wh)min=17us。
4、CS为低电平的时候读取数据;高电平的时候AD转换。
5、数据的读取需要8个ioclk,在ioclk上升沿的时候读取数据位。 
6、数据必须在CS置零1.4us后才能读取。 
  

                          图1: TLC549的信号时序图                                        

                                            图2: TLC549相关参数

在本次实验中参数如下选取
1、f(ioclk)=1MHz。
2、t(su)=1.5us。
3、t(wh)=17us。


因为FPGA的主时钟是50Mhz (t(sys)=0.02us)
所以t(ioclk)=50*t(sys);
       t(su)=1.5us=75*t(sys);
       t(wh)=17us=850*t(sys);

那么一次AD转换读取需要的时间为:
   t(su)+8*t(ioclk)+t(wh)=(75+8*50+850)*t(sys)=1325*t(sys)


module TLC549ADC
(
 input rst,
 input clk,
 input adc_data,
 output reg cs,
 output reg ioclk,
 output reg [7:0] led_out,
 output reg [3:0] V_H,
 output reg [3:0] V_L,
 output reg [3:0] Va_100,
 output reg [3:0] Va_10,
 output reg [3:0] Va_1
);
 integer k;
 reg signed [7:0] data_r [255:0]; //256个8位的数据缓存
  
 //clk计数器
 reg [11:0] clk_cnt;
 wire cs_n_read;
 wire cs_high;
 wire conover;
 
 //时钟计数器
 always @(posedge clk or negedge rst) begin
  if(!rst)
   clk_cnt <= 11'd0;
  else if(clk_cnt >=11'd1325)
   clk_cnt <= 11'b0;
  else
   clk_cnt <= clk_cnt + 1'b1;
 end
 // t(su)+8*t(ioclk)+t(wh)=(75+8*50+850)*t(sys)=1325*t(sys)
 assign cs_n_read = (clk_cnt > 11'd74)&&(clk_cnt <= 11'd475); //400个t(sys)
 assign cs_high  = (clk_cnt > 11'd475)&&(clk_cnt <= 11'd1325);//850个t(sys)
 assign conover = (clk_cnt == 11'd425) ? 1'b1 : 1'b0; //数据读取完后conover有一个上升沿
 
 //CS的时序;在AD转换的过程中CS为高电平,在数据读取的过程中CS为低电平。
 always @(posedge clk or negedge rst) begin
  if(!rst)
   cs <= 1'b1;
  else if(cs_high)
   cs <= 1'b1;
  else
   cs <= 1'b0;
 end
 
 //50分频;提供IOClk信号 
 reg [5:0] div_cnt;
 always @(posedge clk or negedge rst) begin
  if(!rst) begin
   div_cnt <= 6'd0;
   ioclk <= 1'b0;
   end
  else if(cs_n_read) begin   //从第75t(sys)到第475t(sys),这400个时钟里才有IOCLK信号,
             //才能读取数据,这样保证在0到第74t(sys)CS是低电平的。
   div_cnt <= div_cnt + 1'b1;  
   if(div_cnt < 6'd25)
    ioclk <= 1'b1;
   else if((div_cnt >= 6'd25)&&(div_cnt < 6'd50))
    ioclk <= 1'b0;
   else
    div_cnt <= 6'b0;
  end
 end
 
 //读取数据
 reg[7:0] radc_data;
 always @(posedge clk or negedge rst) begin
  if(!rst)
   radc_data <= 8'b0;
  else
  begin
   case(clk_cnt) //没50个t(sys)读取一个数据位
     11'd75: radc_data[7] <= adc_data;
     11'd125: radc_data[6] <= adc_data;
     11'd175: radc_data[5] <= adc_data;
     11'd225: radc_data[4] <= adc_data;
     11'd275: radc_data[3] <= adc_data;
     11'd325: radc_data[2] <= adc_data;
     11'd375: radc_data[1] <= adc_data;
     11'd425: radc_data[0] <= adc_data; 
     default: radc_data[0] <= 1'b0;
   endcase
  end
 end     
 
 //数据处理,conover
 reg [7:0] data_cnt;
 reg [15:0] Sum;
 always @(posedge conover or negedge rst) begin
  if(!rst)
  begin
   for(k=0;k<=255;k=k+1)
    data_r [k] = 8'b0;
    led_out <= 8'hx;
  end
  else
  begin
   data_r[data_cnt] <= radc_data;
   data_cnt <= data_cnt + 1'b1; //单个数据放入缓存
   if(data_cnt == 8'd255)
   begin      //写满256个缓存数据
    for(k=0;k<=255;k=k+1)
     Sum = Sum + data_r[k];
    Sum = Sum/255;   //求平均
    V_H = Sum[7:4];
    V_L = Sum[3:0];
    Sum = Sum*245/255; //换算成电压值
    led_out <= ~Sum[7:0];
    Va_100 <= Sum[7:0]/100;
    Va_10 <= Sum[7:0]/10%10;
    Va_1 <= Sum[7:0]%10; 
   end
  end
 end
  
endmodule

改进后效果明显比上次好一些


sof、pof下载:
时钟为Y1——回复可见内容——
时钟为Y2——回复可见内容——


高工
2012-10-20 18:46:51     打赏
47楼
你下载这个数字时钟吧,用的外部资源比较多,用来测试更合适http://forum.eepw.com.cn/thread/221172/6#53

高工
2012-10-21 13:07:46     打赏
48楼
16、TLC5620的封装错误解决方案及测试程序

详细问题见我发的另一个帖子:
http://forum.eepw.com.cn/thread/221831/1

测试sof下载:看好你的晶振再下载
按键S1进行通道选择A、B、C、D;
按键S2、S3进行code的调节(00-FF);
按键S4是RNG的选择,0或者1;
按键S5是设置写入芯片并DA转换;
Vo=REF*(CODE/256)*(1+RNG bit)

Y1
——回复可见内容——
Y2:——回复可见内容——

高工
2012-10-21 14:31:25     打赏
49楼
测试用的sof文件

高工
2012-10-21 17:57:47     打赏
50楼

“见贤思齐”不该当啊,大家相互学习


共76条 5/8 |‹ 3 4 5 6 7 8 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]