AD7175-2使用问题记录
2015-08-03 19:13
531 查看
1.STM32 SPI接口配置
使用SPI前先了解下SPI协议:
http://bbs.chinaunix.net/thread-1916003-1-1.html
2.如何使用该芯片的单端输入模式
从上图中可以看出,要使用单端方式,必须从5个输入口中选用一个作为公共点并将其作为通道的一个输入,以公共点的电压作为偏置电压。
如果调试过程中出现满量程错误(数据寄存器中为0xFFFFFF)或欠量程错误(数据寄存器中为0x000000),那么就要检查下通道寄存器的两个输入口相对电压是否正确。我在将AIN0接到0V时,显示欠量程错误;接到5V显示满量程错误,不晓得为什么。
3.单极性和双极性
例:AIN4接2.5V的电压,参考电压选用内部的2.5V,AIN0接外部模拟输入。变量voltage为计算所得电压,value为数据寄存器中的值。
单极性的计算公式为:
使用SPI前先了解下SPI协议:
http://bbs.chinaunix.net/thread-1916003-1-1.html
GPIO_InitTypeDef GPIO_InitStruct; SPI_InitTypeDef SPI_InitStruct; /*使能GPIOB, SPI2时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); /*sck miso mosi*/ GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz; GPIO_Init(GPIOB, &GPIO_InitStruct); /*配置cs为开漏输出*/ GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_SetBits(GPIOB, GPIO_Pin_12); SPI_InitStruct.SPI_Mode = SPI_Mode_Master; SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStruct.SPI_CRCPolynomial = 7; SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b; SPI_InitStruct.SPI_NSS = SPI_NSS_Soft; SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;/**/ SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB; SPI_InitStruct.SPI_CPOL = SPI_CPOL_High;/*此处根据AD7175-2数据手册进行配置*/ SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge; SPI_Init(SPI2, &SPI_InitStruct); SPI_Cmd(SPI2, ENABLE);我在使用时发现NSS位不能被SSI赋值,因此只能手动进行CS(片选)的开关操作。
2.如何使用该芯片的单端输入模式
从上图中可以看出,要使用单端方式,必须从5个输入口中选用一个作为公共点并将其作为通道的一个输入,以公共点的电压作为偏置电压。
如果调试过程中出现满量程错误(数据寄存器中为0xFFFFFF)或欠量程错误(数据寄存器中为0x000000),那么就要检查下通道寄存器的两个输入口相对电压是否正确。我在将AIN0接到0V时,显示欠量程错误;接到5V显示满量程错误,不晓得为什么。
3.单极性和双极性
例:AIN4接2.5V的电压,参考电压选用内部的2.5V,AIN0接外部模拟输入。变量voltage为计算所得电压,value为数据寄存器中的值。
单极性的计算公式为:
/*第一个2.5为偏置电压,第二个2.5为参考电压.*/ voltage = 2.5 + value * 2.5 / 0xFFFFFF;</span>双极性(偏移二进制)计算公式:
/*第一个2.5为偏置电压,第二个2.5为参考电压.*/ if(ad_id & 0x800000) { voltege = 2.5 + (value^0x800000) * 2.5 / 0x7fffff;/*异或是在做补码计算*/ } else { voltage = 2.5 - ((value^0x7FFFFF) + 1) *2.5 / 0x7fffff; }/*注意"+"的优先级高于"^"*/</span>
相关文章推荐
- SNMPv3 - 用户安全模型
- HDU 4046
- CURL并发
- QJSON的编译方法【记录】
- HPU-ACM暑期培训第2周14级个人赛:Problem E HDU 4883
- mysql常用命令
- 网络连接
- HBase学习总结(5):HBase表设计
- 数据库连接
- hud 1012 u Calculate e (acm)
- Linux进程间通信——使用共享内存
- 黑马程序员 c语言的基础
- final,finally,finalize的区别?
- Mac下安装nginx
- Illegal spices (URAL 1995 YY构造)
- Codeforces Round #273 (Div. 2) C - Table Decorations dp
- FpmBizSubModuleCond
- java环境搭建
- 2015暑假训练赛团体赛(8.3)
- FpmBizSubModuleVo