芯片资料
ad精度
一个字都不说这没人帮得了你。。。
我说个大概吧:
用ad芯片和其他芯片一样
片选给上去。输入数据的时钟和mcu的输出连起来,输入数据端和数据总线连起来。同步时钟一般用个特定频率的晶振,如果频率低就用mcu的定时器做分频。
要让ad工作一般需要首先往ad的设置寄存器里写设置数据,定义ad使用哪个通道,增益是多少,频率是多少等。
然后向设置好的ad芯片发送实际需要读取哪个通道。
最后再写回读函数,将dataout脚上的数据传回mcu进行之后的 *** 作。
例程的话百度文库里有很多。
void write_CS5550(uchar data_to_send) //{
uchar i AD_SCLK=0
// AD_CS =0
Delay_us(20) // for (i=0i<8i++)
{
if( (data_to_send&0X80)==0 )
{
AD_SDI=0
}
else{AD_SDI=1}
AD_SCLK=1
Delay_us(10)//
AD_SCLK=0
data_to_send<<=1
}
}
uchar read_CS5550(void) //
{
unsigned char n=0,i=0
for(n=0n<3n++)
{
for(i=0i<8i++)
{
cs5550_receive_table[n]<<=1
if(AD_SDO==0)
{
cs5550_receive_table[n]|=0x01
}
else cs5550_receive_table[n]&=0xFE
Delay_us(5)
ACC_0=AD_SDO //
Delay_us(5)
AD_SCLK=1//
a<<=1
Delay_us(10)
AD_SCLK=0 //
Delay_us(30) //
}
a=0xfe
// cs5550_receive_table[n]=ACC
}
// AD_CS=1
return ACC
}
这是个我一直用的代码,没问题。就是是VERILOG的,你自己改改吧/**************************************************************************************************
** TLC549 AD转换器 verilog代码
**************************************************************************************************/
moduleadc(
clk,
rst_n,
adc_clk,
adc_data,
adc_cs_n,
rAdc_data
)
inputclk // 50MHz输入时钟
inputrst_n // 复位信号,低有效
input adc_data // ADC芯片输出的数据
output adc_clk // ADC芯片输入时钟
output adc_cs_n // ADC芯片片选信号,低有效
output[7:0]rAdc_data
reg start_adc
/*************************************************************************************************/
reg[10:0] clk_cnt // clk计数器
wire cs_n_valid1
wire cs_high
wire cs_n_valid2
always @(posedge clk or negedge rst_n)
if (!rst_n)
begin clk_cnt <= 11'd0start_adc<=1end
else if (start_adc)
clk_cnt <= clk_cnt + 1'b1
/*
** 完成一次转换需要75+8*64+850+75+8*64=2024个时钟周期
** adc_cs_n建立时间为75个时钟周期1.5us 转换时间保持高电平17us,即850个时钟周期
** adc_clk周期为系统时钟的64倍
*/
assign cs_n_valid1 = (clk_cnt >11'd74) &&(clk_cnt <= 11'd587)
assign cs_high= (clk_cnt >11'd587) &&(clk_cnt <= 11'd1437)
assign cs_n_valid2 = (clk_cnt >11'd1512) &&(clk_cnt <= 11'd2024)
//=================================================================================================
regrAdc_cs
always@(posedge clk or negedge rst_n)
if (!rst_n)
rAdc_cs <= 1'b1
else if (start_adc) begin
rAdc_cs <= 1'b0
if (cs_high)
rAdc_cs <= 1'b1
else
rAdc_cs <= 1'b0
end
assign adc_cs_n = rAdc_cs
//=================================================================================================
reg [5:0] div_cnt // 64分频计数器
reg rAdc_clk
always @(posedge clk or negedge rst_n)
if (!rst_n) begin
div_cnt <= 6'd0
rAdc_clk <= 1'b0
end
else if ((cs_n_valid1) || (cs_n_valid2)) begin
div_cnt <= div_cnt + 1'b1
if (div_cnt <32)
rAdc_clk <= 1'b1
else
rAdc_clk <= 1'b0
end
assign adc_clk = rAdc_clk
//=================================================================================================
reg [7:0] rAdc_data
always @(posedge clk or negedge rst_n)
if (!rst_n)
rAdc_data <= 8'd0
else
case (clk_cnt)
11'd1513:rAdc_data[7] <= adc_data
11'd1577:rAdc_data[6] <= adc_data
11'd1641:rAdc_data[5] <= adc_data
11'd1705:rAdc_data[4] <= adc_data
11'd1769:rAdc_data[3] <= adc_data
11'd1833:rAdc_data[2] <= adc_data
11'd1897:rAdc_data[1] <= adc_data
11'd1961:rAdc_data[0] <= adc_data
default:rAdc_data[0] <= 1'b0
endcase
endmodule
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)