本帖最后由 chen849928055 于 2018-3-20 16:12 编辑
碰到的问题:1.在调试过程中,首先是采集的ADC值乱跳,都几百1000多的跳, 后来发现把增益PGA设置为16以上,读到的值总为0x007FFFFF;PGA设置为1时,读取的ADC值接近自己实际计算的值;
查手册我的PGA设置为16以下, 共模电压(ADCINP + ADCINN)/2在共模范围之内。V IN = ADCINP – ADCINN是差模输入电压,可正可负,但它的绝对值要<=VREF/PGA
0.5
2:用示波器测试波形,SCK DIN DO写入读出的寄存器的值都是正确的;读取的ADC值波动这问题找了一个多星期了还没找到,望使用过ADS1248这类芯片的网友多指点指点,提提建议,先谢谢了!!!
1.先上原理图
2.下面是我的程序初始化:
/*********************************************************************************************************
* @Function Name: SPI_FLASH_Init
* @Description : SPI和GPIO初始化
* @param : void
* @retval : void
* @date : 2018/03/04 PA4->SPI0_SCK PA5->SPI0_MOSI PA6->SPI0_MISO PA7->SPI0_SEL
#define ADS1248_RST GPIO_PIN_2 PA
#define ADS1248_READY GPIO_PIN_3 PA
#define ADS1248_SCK GPIO_PIN_4 PA
#define ADS1248_DO GPIO_PIN_5 PA
#define ADS1248_DIN GPIO_PIN_6 PA
#define ADS1248_CS GPIO_PIN_7 PA
#define ADS1248_START PC12
注意一点:SCK时钟不能太快,必须小于2MHz,程序实际采用的时钟约1MHz. ADS1248芯片是在SCK下降沿采样数据.
********************************************************************************************************/
void SPI_FLASH_Init(void)
{
SPI_InitTypeDef SPI_InitStructure;
/* Enable AFIO & SPI SEL pin port & SPI clock */
CKCU_PeripClockConfig_TypeDef CKCUClock = {
{0}};
CKCUClock.Bit.PA = 1;
CKCUClock.Bit.SPI0 = 1;
CKCUClock.Bit.AFIO = 1;
CKCUClock.Bit.PDMA = 1;
CKCU_PeripClockConfig(CKCUClock, ENABLE);
/* Configure SPI SCK pin, SPI MISO pin, SPI MOSI pin */
AFIO_GPxConfig(GPIO_PA, ADS1248_SCK , AFIO_FUN_SPI);
AFIO_GPxConfig(GPIO_PA, ADS1248_DIN, AFIO_FUN_SPI);
AFIO_GPxConfig(GPIO_PA, ADS1248_DO, AFIO_FUN_SPI);
AFIO_GPxConfig(GPIO_PC, ADS1248_START , AFIO_MODE_DEFAULT); //START io初始化
GPIO_DirectionConfig(HT_GPIOC, ADS1248_START, GPIO_DIR_OUT);
AFIO_GPxConfig(GPIO_PA, ADS1248_RST , AFIO_MODE_DEFAULT); // RST io初始化
GPIO_DirectionConfig(HT_GPIOA, ADS1248_RST, GPIO_DIR_OUT);
GPIO_DirectionConfig(HT_GPIOA, ADS1248_READY, GPIO_DIR_IN); //输入 DRDY
GPIO_PullResistorConfig(HT_GPIOA, ADS1248_READY, GPIO_PR_UP); //设置上拉
GPIO_InputConfig(HT_GPIOA, ADS1248_READY, ENABLE); //上拉使能
/* SEL output inactive level */
// AFIO_GPxConfig(GPIO_PA, ADS1248_CS , AFIO_MODE_DEFAULT); //CS io初始化
ADS1248_CS_H();
GPIO_DirectionConfig(HT_GPIOA, ADS1248_CS, GPIO_DIR_OUT);
/* SPI Configuration */
SPI_InitStructure.SPI_Mode = SPI_MASTER;
SPI_InitStructure.SPI_FIFO = SPI_FIFO_ENABLE;
SPI_InitStructure.SPI_DataLength = SPI_DATALENGTH_8;
SPI_InitStructure.SPI_SELMode = SPI_SEL_SOFTWARE;
SPI_InitStructure.SPI_SELPolarity = SPI_SELPOLARITY_LOW;
SPI_InitStructure.SPI_FirstBit = SPI_FIRSTBIT_MSB;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_LOW ; // SCK 的下降沿被采集
SPI_InitStructure.SPI_CPHA = SPI_CPHA_SECOND;
SPI_InitStructure.SPI_RxFIFOTriggerLevel = 4;
SPI_InitStructure.SPI_TxFIFOTriggerLevel = 4;
SPI_InitStructure.SPI_ClockPrescaler = 36; /* 原来为2 72/2=36MHz, Normal Read frequency */ // 72/32=24/32=0.75MHz,ADS1248的SCLK最快约2MHz
SPI_Init(FLASH_SPI, &SPI_InitStructure);
SPI_SELOutputCmd(FLASH_SPI, ENABLE);
SPI_Cmd(FLASH_SPI, ENABLE);
}
void ADS1248_Init(void)
{
unsigned char temp;
SPI_FLASH_Init();
ADS1248_RST_L();
ADS1248_START_L();
ADS1248_Delay(4000);
ADS1248_RST_H();
ADS1248_START_H();
ADS1248_Delay(60000); //延时20ms;手册要求延时至少16ms
ADS1248_CS_L();
ADS1248_WriteREG(ADS_MUX0, 0x01);
ADS1248_WriteREG(ADS_MUX1, 0x30);//00110000,Bit7:启用内部晶振,Bit6-5:内部基准一直打开,Bit4-3:输入基准为片上基准,Bit2-0:普通模式
ADS1248_Delay(10000); //延时10ms
ADS1248_WriteREG(ADS_VBIAS, 0x00); //00000000,Bit7-0:偏置电压选择关闭(默认)
ADS1248_WriteREG(ADS_IDAC1, 0xFF); //11111111,Bit7-4:断开内部第一恒流源的连接,Bit3-0:断开内部第二恒流源的连接 0X8F打开第一内部恒流源
ADS1248_WriteREG(ADS_IDAC0, 0x08); //00001000,Bit7-4:只读,Bit3:DRDY/DOUT功能复用Dout线 ,Bit2-0:关闭内部恒流源
ADS1248_WriteREG(ADS_SYS0, 0x00); //00000000,Bit7:必须设置为0,Bit6-41:选择1倍增益,Bit3-0:选择5SPS测量速度
}
/*******************************************************************************
* @Function Name: ADS1248_ReadREG
* @Description : 写寄存器的第byteToRead个字节
* @param : u8 regName
* @param : u8 byteToRead
* @retval : u8
* @date : 2014/10/05
*******************************************************************************/
void ADS1248_WriteREG(u8 regaddr, u8 databyte)
{
//向寄存器写入数据地址
ADS1248_WriteByte(ADS_WREG+(regaddr&0x0f));
ADS1248_WriteByte(0x00);
//向regaddr地址指向的寄存器写入数据databyte
ADS1248_WriteByte(databyte);
}
今天的文章adc采样的值跳动_请帮忙分析下ADS1248测PT100,读取的ADC值跳动较大?是什么原因?分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/33513.html