LTC1867芯片单极模式只能采样0~2V
在stm32f107基础上使用LTC1867芯片采样,设置单极性后只能采样要0~2V的电压,基准为4V。请大神帮忙!!!!0~2V采样正常,2~4V读到的电压又从0开始递增。实际电压0V对应采集值0V,实际电压2V对应采集值为2V,2.01V开始就变成了0V,实际电压4V对应的采集值是1.996V。确认配置为单极性。
#define ADC_CS_H GPIO_SetBits(GPIOA,GPIO_Pin_4);
#define ADC_CS_L GPIO_ResetBits(GPIOA,GPIO_Pin_4);
#define ADC_SCK_H GPIO_SetBits(GPIOA,GPIO_Pin_5);
#define ADC_SCK_L GPIO_ResetBits(GPIOA,GPIO_Pin_5);
//#define ADC_MISO GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6)
#define ADC_MISO GPIOA->IDR&(1<<6)
#define ADC_MOSI_H GPIO_SetBits(GPIOA,GPIO_Pin_7);
#define ADC_MOSI_L GPIO_ResetBits(GPIOA,GPIO_Pin_7);
#define Instructions_LTC1867_CH0 0x80
#define Instructions_LTC1867_CH1 0xC0
#define Instructions_LTC1867_CH2 0x90
#define Instructions_LTC1867_CH3 0xD0
#define Instructions_LTC1867_CH4 0xA0
#define Instructions_LTC1867_CH5 0xE0
#define Instructions_LTC1867_CH6 0xB0
#define Instructions_LTC1867_CH7 0xF0
#define LTC1867_SLEEP_MODE 0x02
#define LTC1867_EXIT_SLEEP_MODE 0x00
#define LTC1867_UNIPOLAR_MODE 0x04
#define LTC1867_BIPOLAR_MODE 0x00
/******************************************
*功能:SPI初始化
*******************************************/
void SPI_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//----------------------GPIO----------------------
// Configure SPI pins: CS
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// Configure SPI pins: SCK
GPIO_InitStructure.GPIO_Pin = 0;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// Configure SPI pins: MISO
GPIO_InitStructure.GPIO_Pin = 0;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// Configure _SPI pins: MOSI
GPIO_InitStructure.GPIO_Pin = 0;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//设置为空闲状态
ADC_CS_H;
ADC_SCK_H;
}
/************************************************
*功能: LTC1867ACGN选择1~8通道
*************************************************/
u8 LTC1867ACGN_SetChnl(u8 chnl)
{
u8 cmd;
switch(chnl)
{
case 1:
cmd = Instructions_LTC1867_CH0|LTC1867_UNIPOLAR_MODE;break;
case 2:
cmd = Instructions_LTC1867_CH1|LTC1867_UNIPOLAR_MODE;break;
case 3:
cmd = Instructions_LTC1867_CH2|LTC1867_UNIPOLAR_MODE;break;
case 4:
cmd = Instructions_LTC1867_CH3|LTC1867_UNIPOLAR_MODE;break;
case 5:
cmd = Instructions_LTC1867_CH4|LTC1867_UNIPOLAR_MODE;break;
case 6:
cmd = Instructions_LTC1867_CH5|LTC1867_UNIPOLAR_MODE;break;
case 7:
cmd = Instructions_LTC1867_CH6|LTC1867_UNIPOLAR_MODE;break;
case 8:
cmd = Instructions_LTC1867_CH7|LTC1867_UNIPOLAR_MODE;break;
default:
cmd = Instructions_LTC1867_CH0|LTC1867_UNIPOLAR_MODE;break;
}
return cmd;
}
/**********************************
*功能: SPI读写数据,给定通道选择参数
***********************************/
u16 SPI_WriteRead(u8 chnl)
{
u8 i = 0;
u16 dat = 0;
u8 cmd = 0;
cmd = LTC1867ACGN_SetChnl(chnl);
ADC_CS_L;
delay_5us(10); //50
for(i=0;i<7;i++)
{
if(cmd&(0x80))
{
ADC_MOSI_H;
}else{
ADC_MOSI_L;
}
cmd <<= 1;
ADC_SCK_L;
delay_5us(1); //5
ADC_SCK_H;
delay_5us(1); //5
}
ADC_CS_H;
delay_5us(2); //10
ADC_CS_L;
for(i=0;i<16;i++)
{
ADC_SCK_L;
delay_5us(1); //2
if(ADC_MISO) dat |= 1;
dat <<= 1;
ADC_SCK_H;
delay_5us(1); //2
}
ADC_CS_H;
return dat;
}
多啃啃datasheet,这个芯片应该是单 5V 工作电源,你的结果不准确除了与软件有关系。
而且与你的硬件也有关系。没看你的硬件电路,说不好。
不过,你多啃datasheet是没错的。 ADC硬件电路按LTC1867手册给的参考电路就行,剩下的就是看时序图写软件的事情 qwqwqw2088 发表于 2018-2-22 10:03
ADC硬件电路按LTC1867手册给的参考电路就行,剩下的就是看时序图写软件的事情
问题已找到,读数据的时候,先移位再接受数据,我的是先接收数据再移位 <p>请问一下这两句什么意思啊,我刚入门</p>
<p> </p>
<p>#define ADC_MISO GPIOA->IDR&(1<<6)</p>
<p> </p>
<p>if(ADC_MISO) dat |= 1;</p>
<p> dat <<= 1;</p>
页:
[1]