|
本帖最后由 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<V REF <(AVDD -AVSS) - 1
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);
} |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|