1. ads8688芯片简介
芯片详细介绍可仔细查看数据手册,链接:
由于数据手册内容太多,在次不做过多介绍,此处将只对实现8通道的扫描采集所涉及到的知识点做解释说明,大概需掌握如下3点。
1.1 程序寄存器配置
程序寄存器映射图如下所示。16位的程序寄存器可设置0~7通道的电压范围及其他内容,可直接将16位的数据(已含地址)写入芯片。
采集通道电压范围定义如下。
1.2 命令寄存器
命令寄存器可配置为自动扫描模数、手动扫描模数等其他模数。
1.3 时序图
详细时序图满足如下要求即可。
1.4 程序设计思路
1. 配置程序寄存器,将0~7通道的电压范围写入程序寄存器
2. 配置命令寄存器,选择自动扫描模数,先写入16'hA000,选择自动从0通道开始采集,后续写入16'h0000表示继续自动扫描至1通道一次类推。
值得注意的一点是:32个时钟为一次读写完整周期,在配置自动选择模式时,当第一次32个时钟周期写入16'hA000选择自动模式后,应在第二次32个时钟周期的后16个时钟周期读取出采集的数据。
2. 工程在线调试结果
3.程序列表
4.PLL调用设置
5.详细代码
5.1顶层模块代码
module TopModule(
input ExtClk,
input ExtRstN,
input SDO,
output SDI,
output CS_N,
output SCLK);
//
Ads8688 UUTAds8688(
.CLK100M(CLK100M),//100M
.RST_N(RST_N),
.SCLK(SCLK),//10M
.CS_N(CS_N),
.SDI(SDI),
.SDO(SDO));
//
PllClk UUTPllClk
(
// Clock out ports
.clk_out1(CLK100M), // output clk_out1
// Status and control signals
.reset(~ExtRstN), // input reset
.locked(RST_N), // output locked
// Clock in ports
.clk_in1(ExtClk)); // input clk_in1
endmodule
5.2.Ads8688模块代码
//SPI通信协议
//[2:0]RangeChn 101 Vref = 4.096V
// 000表示±2.5Vref;001表示±1.25Vref;010表示0.625Vref;101表示0~2.5Vref;110表示0~1.25Vref
//101表示选中0~10.24V;0001h~ffffh 156.25uV
//0000:0 0001:156.25
//顺序:先配置程序寄存器,再配置命令寄存器
//程序寄存器:各个通道的电压范围配置
//命令寄存器:模式选择、通道选择
module Ads8688(
input CLK100M,//100M
input RST_N,
output reg SCLK,//10M
output reg CS_N,
output reg SDI,
input SDO);
//命令寄存器命令字
parameter AutoRst = 16'hA000;//自动扫描通道
//程序寄存器
parameter RangeChn = 3'b101;//0~10.24V
parameter WriteEn = 1'b1;
parameter ReadEn = 1'b0;
parameter Ch0InRange = {7'h05,WriteEn,5'd0,RangeChn};
parameter Ch1InRange = {7'h06,WriteEn,5'd0,RangeChn};
parameter Ch2InRange = {7'h07,WriteEn,5'd0,RangeChn};
parameter Ch3InRange = {7'h08,WriteEn,5'd0,RangeChn};
parameter Ch4InRange = {7'h09,WriteEn,5'd0,RangeChn};
parameter Ch5InRange = {7'h0A,WriteEn,5'd0,RangeChn};
parameter Ch6InRange = {7'h0B,WriteEn,5'd0,RangeChn};
parameter Ch7InRange = {7'h0C,WriteEn,5'd0,RangeChn};
//[17:0]Cnt2ms
reg [17:0]Cnt2ms;
always@(posedge CLK100M or negedge RST_N)
if(RST_N == 1'b0) Cnt2ms <= 'd0;
else if(Cnt2ms == 'd200) Cnt2ms <= 'd200;
else Cnt2ms <= Cnt2ms + 1'b1;
//ConfigureStage 配置阶段(程序寄存器)
reg ConfigureStage;
always@(posedg