A/D转换原理及参数指标
1. 采样定理 2. 为了正确无误的用图5.2.2中所示的采样信号vs表示模拟信号vi,必须满足式中, fs>=2fmax
fs为采样频率;fmax为输入信号vi的最高频率分量的频率;上式就是所谓的采样定理。满足采样定理的条件下,可以用一个低通滤波器将信号vs还原为vi,这个低通滤波器的电压传输系数|A(f)|在低于fmax的范围内应保持不变,而在fs-fmax以前应迅速下降为零,采样定理规定了A/D转换的频率下限。
AD7792 遇到的问题/学到的知识点
学到的知识点: 1.在STM32中 U8 : unsigned char U16: unsigned short U32: unsigned int 2. 在stm32中 AD7792采样的电压数值要经过转换成ASCII码字符在串口中打印出来有两种编程方式实现: u8TempD; u16 Datau16; char str[20]; unsigned short iData[3]; u8 Strvbat[8]={'/','/','/',',',0,0,0,0}; u8 ASCII[21]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','+',//10->16 ',',//11-17 '-',//12-18 '.',//13-19 '/',//14-20 };
方式一:(简洁版) AD_VBat[TempD] = SPI_Read16Bit(); memcpy(&iData[0],& AD_VBat[TempD],2); sprintf(str,"%d",iData[0]); UART1_TX485_Puts(USART1,&str[0]);
方式二:(复杂版) AD_VBat[TempD] = SPI_Read16Bit(); Datau16 = AD_VBat[TempD]; Strvbat[0]=ASCII[Datau16/10000]; Strvbat[1]=ASCII[Datau16%10000/1000]; Strvbat[2]=ASCII[Datau16%1000/100]; Strvbat[3]=ASCII[Datau16%100/10]; Strvbat[4]=ASCII[Datau16%10]; UART1_TX485_Puts(USART1,&Strvbat[0]); while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET); 3.遇到的问题 问题一:通过串口打印,采样的数值为32768左右转化后的电池电压为2.5V,而电池实际电压应该为3.32v采样数值应该为43582左右的数值;
问题根源:通道切换的问题; AD7792有3个模拟输入通道,初始化AD7792配置函数中,写配置寄存器SPI_SendByte(0x10); /* 写配置寄存器*/ SPI_Send16Bit(0x1080); // 偏置电压禁用禁用熔断电流单极性编码内部基准 SPI_Send16Bit(0x1080)设置的采样通道是采样电流的通道,所以采样的是电流的数值;
问题二:在移植AD7792独立出来时,发现电池电压采样值打印为0000; 问题根源:SPI配置问题; 原理图:
错误配置: GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOAtiNG; //浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //通用推挽输出 GPIO_Init(GPIOA, &GPIO_InitStructure); 正确配置: /* Configure SPI1 pins: SCK, MISO and MOSI */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_4|GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //通用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* 配置MISO为输入 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure);
|