|
马老师:
我用12位A/D芯片TLC2543采集电压,由于SPI口的循环移位寄存器是8位,TLC2543在12位分辨率下无法通过直接应用SPI实现,所以我将AD采集方式设定在16位方式下,且MSB导前.再将16位伪数据转换成12为实际数据后,用4位数码管显示. 我没有用到SPI中断方式,而是使SS一直保持低电平,在每一次的While循环下采集通道0的模拟量.
但数码管显示结果却是0000或4750,而且无论怎么调整通道0的模拟电压值,显示结果均仍为0000或4750保持不变.由此分析,AD采集后的数据要么是0X000,要么是0XFFF.可不知程序问题在哪?请您赐教!
程序如下:
/*****************************************************
Chip type : ATmega16
Program type : Application
Clock frequency : 4.000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
Function : SPI方式下的TLC2543 AD采集电压 由数码管显示
*****************************************************/
#include <mega16.h>
#include <delay.h>
#define SS PORTB.4
#define uchar unsigned char
#define uint unsigned int
uchar shumaguan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar position[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar adch;//高8位采集数据
uchar adcl;//低8位采集数据
uint AD_data;
uint vot;
uchar dis_buff[4];
void display(void);
void vot_to_disbuffer(void);
void main(void)
{
uchar clear;
uchar n;
PORTA=0x00;
DDRA=0xFF;
PORTB=0x40;//SPI接口
DDRB=0xB0;//SS SCK MOSI为输出 MISO为输入上拉有效
PORTC=0x00;
DDRC=0xFF;
SPCR=0x50;//主机模式 模式0 高位在前
SPSR=0x01;//由于TLC2543的最高通信频率为4.1MHZ,所以可以选择SPI时钟频率为4MHZ/2=2MHZ
SS=0;
while (1)
{
AD_data=0;
//高8位采集
SPDR=0x0c;//通道0,16位AD采集方式
while(!(SPSR&0x80));
clear = SPSR;
adch=SPDR;
//低8位采集
SPDR=0x0c;通道0,16位AD采集方式
while(!(SPSR&0x80));
clear = SPSR;
adcl=SPDR;
SS=1;
//将采集到的16位数据转换为实际的12位数据
AD_data|=adch;
AD_data<<=8;
AD_data|=adcl;
AD_data>>=4;
//将12位数字信号转换为电压值后,由数码管显示
vot_to_disbuffer();
display();
for(n=0;n<30;n++) //加上这个循环,稳定显示的数据,便于看清
display();
}
}
void display(void)
{
uchar i;
for(i=0;i<4;i++)
{
PORTC=position;
PORTA=shumaguan[dis_buff];
delay_ms(3);
}
}
void vot_to_disbuffer(void)
{
vot= AD_data*(4750.00f/4095);
dis_buff[0]=vot%10;//0.001v级
dis_buff[1]=vot%100/10;//0.01v级
dis_buff[2]=vot/100%10;//0.1v级
dis_buff[3]=vot/1000;//1v级
} |
|