最近在搞ADS1247,双通道,接两个铂电阻,这个是原理图:
现在读写控制寄存器都是可以的,但是读转换值一直不对,我先尝试的初始化一个通道,读一个通道
//使用到两个差分通道,初始化选择的通道
void InitADS1247(unsigned char channelx)
{
ADS_START_0;
ADS_RESET_0;
delay_ms(10);
ADS_RESET_1;
delay_ms(20);
ADS1247WREG(ADS1247_REG_MUX0,channelx);
// ADS1247WREG(ADS1247_REG_MUX0,0x01); //AIN0+ AIN1-
//ADS1247WREG(ADS1247_REG_MUX0,0x13); //AIN2+ AIN3-
delay_ms(20);
ADS1247WREG(ADS1247_REG_MUX1,0x38); // 00111000,bit7:启用内部晶振;bit6-5:内部参考电压一直打开;bit4-3:输入基准为片上基准,并且连接到REFP0;bit2-0:普通模式 (查看是否有1.5mA电流)
delay_ms(20);
ADS1247WREG(ADS1247_REG_VBIAS,0); //偏置电压关闭(默认)
delay_ms(20);
if(channelx==0x01) ADS1247WREG(ADS1247_REG_IDAC1,0x01); // 选择内部恒流源输出引脚 AIN0 AIN1
else ADS1247WREG(ADS1247_REG_IDAC1,0x23); // 选择内部恒流源输出引脚 AIN2 AIN3
delay_ms(20);
//ADS1247WREG(ADS1247_REG_IDAC0,0x0f); // DOUT/DRDY pin function both data out and data ready 并且1.5mA
ADS1247WREG(ADS1247_REG_IDAC0,0x07); //DOUT/DRDY pin functions only as Data Out (default) 并且1.5mA
delay_ms(20);
q=ADS1247RREG(ADS1247_REG_IDAC1);
printf("测试:%x
",q);
printf("测试:%d
",channelx);
ADS1247WREG(ADS1247_REG_SYS0,0x79); //128,2000sps
delay_ms(20);
//GPIO_SetBit(GPIOB,GPIO_Pin_15); //DIN拉高
}
void ADS1247_getonechannel(void)
{
u8 count=0;
u8 a=1;
k3=0;
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)&&a) //PB14为 DRDY复用
{
count++;
printf("B14:%d
",1);
if(count>200){printf("B14超时
"); a=0;};
}
SPI_ADS1247_SendByte(ADS1247_CMD_RDATA);
delay_ms(10);
ADH=SPI_ADS1247_SendByte(ADS1247_CMD_NOP);
ADM=SPI_ADS1247_SendByte(ADS1247_CMD_NOP);
ADL=SPI_ADS1247_SendByte(ADS1247_CMD_NOP);
k3|=ADH<<16|ADM<<8|ADL;
printf("温度:%x
",k3);
}
我在主程序中是初始化一次,读一个通道:
#include "stm32f4xx.h"
#include "usart.h"
#include "delay.h"
#include "mygpio.h"
#include "ads1247.h"
int main(void)
{
//u32 t=0;
uart_init(115200); //串口波特率
printf("串口OK
");
delay_init(168);
Control_Init();
ADS1247_GPIO_init();
SPI_ADS1247_Init();
InitADS1247(channel1); //初始化通道一,channel1=0x01
ADS1247_getonechannel(); //读单通道
InitADS1247(channel2); //初始化通道二,channel2=0x13
ADS1247_getonechannel(); //读单通道
ADS1247_Convdataget(); // 读两个通道
while(1)
{
GPIO_SetBits(GPIOD,GPIO_Pin_3|GPIO_Pin_2|GPIO_Pin_1|GPIO_Pin_0);
printf("t:%d
",1);
ADS1247_Convdataget();
delay_ms(2000);
GPIO_ResetBits(GPIOD,GPIO_Pin_3|GPIO_Pin_2|GPIO_Pin_1|GPIO_Pin_0);
printf("t:%d
",2);
ADS1247_Convdataget();
delay_ms(2000);
}
}
但是读出来的数不正确,不知道哪边不对,麻烦原子哥帮看看。下面是读的时序:
另外,我还想连续读两个通道,但是看了这个时序图,有个地方不明白:
这边WREG是写控制寄存器的意思,但是这边又没说写哪个寄存器,ads1247有15个控制寄存器。 //初始化通道一,channel1=0x01 //初始化通道一,channel1=0x01
---------------------------------
没用过哦,呵呵
---------------------------------
好的吧,不知道有没有其他兄弟姐妹用过的,指点一下,感谢!
一周热门 更多>