stm32f103c8t6通过max31865-pt100测温,软件spi通信串口1输出
生活随笔
收集整理的這篇文章主要介紹了
stm32f103c8t6通过max31865-pt100测温,软件spi通信串口1输出
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
pt100測溫精度可達0.1度,測溫范圍-40度~125度
?
?
?
max31865.c文件
#include "max31865.h" #include "math.h" #include "usart.h" #include "delay.h" /* MAX31865 初始化 */ void MAX31865_Init(void) {GPIO_InitTypeDef GPIO_InitStructure ;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitStructure.GPIO_Pin = MAX31865_CS|MAX31865_SCLK|MAX31865_SDI;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(MAX31865_CONTROL_PORT,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = MAX31865_SDO|MAX31865_DRDY;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(MAX31865_CONTROL_PORT,&GPIO_InitStructure);MAX31865_CS_SET;MAX31865_SCLK_SET; }/* MAX31865 寫寄存器 addr:寄存器地址 data:數據 */ void MAX31865_Write(unsigned char addr, unsigned char data) {unsigned char i;MAX31865_CS_CLR;for(i=0;i<8;i++) //寫地址{MAX31865_SCLK_CLR;if(addr&0x80) MAX31865_SDI_SET;else MAX31865_SDI_CLR;MAX31865_SCLK_SET;addr<<=1;}for(i=0;i<8;i++) //寫數據{MAX31865_SCLK_CLR;if(data&0x80) MAX31865_SDI_SET;else MAX31865_SDI_CLR;MAX31865_SCLK_SET;data<<=1;}MAX31865_CS_SET; }/* MAX31865 讀寄存器 addr:寄存器地址 */ unsigned char MAX31865_Read(unsigned char addr) {unsigned char i;unsigned char data=0;MAX31865_CS_CLR;for(i=0;i<8;i++) //寫地址{MAX31865_SCLK_CLR;if(addr&0x80) MAX31865_SDI_SET;else MAX31865_SDI_CLR;MAX31865_SCLK_SET;addr<<=1;}for(i=0;i<8;i++) //讀數據{MAX31865_SCLK_CLR;data<<=1; MAX31865_SCLK_SET; if(MAX31865_SDO_READ) data|=0x01;else data|=0x00;}MAX31865_CS_SET;return data; }/* MAX31865 配置*/ void MAX31865_Cfg(void) {MAX31865_Write(0x80, 0xC3); //BIAS ON,自動,4線,50HZ 根據文件修改四線還是三線 }/* MAX31865 獲取溫度 */ float MAX31865_GetTemp(void) { unsigned int data;float Rt;float Rt0 = 100; //PT100 float Z1,Z2,Z3,Z4,temp;float a = 3.9083e-3;float b = -5.775e-7;float rpoly;// MAX31865_Write(0x80, 0xD3);data=MAX31865_Read(0x01)<<8;data|=MAX31865_Read(0x02);data>>=1; //去掉Fault位printf("Read=%02X\r\n",data);Rt=(float)data/32768.0*RREF;printf("Rt=%.1f\r\n",Rt);Z1 = -a;Z2 = a*a-4*b;Z3 = 4*b/Rt0;Z4 = 2*b;temp = Z2+Z3*Rt;temp = (sqrt(temp)+Z1)/Z4;if(temp>=0) return temp;rpoly = Rt;temp = -242.02;temp += 2.2228 * rpoly;rpoly *= Rt; // squaretemp += 2.5859e-3 * rpoly;rpoly *= Rt; // ^3temp -= 4.8260e-6 * rpoly;rpoly *= Rt; // ^4temp -= 2.8183e-8 * rpoly;rpoly *= Rt; // ^5temp += 1.5243e-10 * rpoly;return temp; }main.c文件
#include "max31865.h" #include "delay.h" #include "sys.h" #include "usart.h" #include "led.h"int main(void) { float temp;delay_init();NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);uart_init(115200);LED_Init();KEY_Init();MAX31865_Init();MAX31865_Cfg();printf("MAX31865 test\r\n");while(1){temp=MAX31865_GetTemp();printf("temp=%.3f\r\n",temp);}}?
?
?
總結
以上是生活随笔為你收集整理的stm32f103c8t6通过max31865-pt100测温,软件spi通信串口1输出的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二次元属性被稀释,B站还剩什么?| 数据
- 下一篇: PWM 调光的线性降压 LED 恒流驱动