本设计基于MAX31865设计了一款上位机实时显示当前温度的温控器,温控器具有报警功能。
下位机采用usb串口供电,供电方式简单,且可通过串口方式一键下载程序,不用使用额外的ST-LINK或者J-link下载。
STM32F103通过 SPI读取MAX31865采集铂电阻PT100温度并通过 串口发送温度值的实验程序。
压缩包包括:
程序源代码
MAX31865芯片手册(pdf格式 中文)
程序使用三线制,内通过修改寄存器数值,改成二线制以及四线制。
高精度设备满足误差预算:
15位ADC分辨率,标称温度分辨率为0.03125°C (随RTD非线性变化);
整个工作条件下,总精度保持在0.5°C (0.05%满量程);
全差分VREF输入;
转换时间:21ms (最大值);
集成故障检测,增加系统稳定性:
单片机源程序如下:
- #include "max31865.h"
- #include "spi.h"
- #include "delay.h"
- //max chushihua
- void MAX31865_Int(void)
- {
-
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能PB端口时钟
- // MAX31865_DRDY_APBxClkCmd(GPIO_Pin_11, ENABLE);
-
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
- GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIB15,14,13
-
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //推挽输出
- GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIB15,14,13
-
- SPI2_Init();
- SPI2_SetSpeed(SPI_BaudRatePrescaler_16);
- }
- /* 向MAX31865发送数据 */
- void MAX31865_SendData(uint8_t addr , uint8_t data)
- {
- SPI_MAX31865_CS_LOW();
- SPI2_ReadWriteByte(addr);
- SPI2_ReadWriteByte(data);
- SPI_MAX31865_CS_HIGH();
- }
- /* 从MAX31865读取数据 */
- uint8_t MAX31865_ReceiveData(uint8_t addr)
- {
- uint8_t data;
- SPI_MAX31865_CS_LOW();
- SPI2_ReadWriteByte(addr);
- data = SPI2_ReadWriteByte(addr);
- SPI_MAX31865_CS_HIGH();
- return data;
- }
- //void MAX31855_ReadData()
- //{
- // u32 data=0;
- // int i;
- // SPI_MAX31865_CS_LOW();
- // delay_ms(1);
- // for(i=31;i>=0;i--)
- // GPIOA_MAX31855_SCK_H;
- // delay_ms(1);
- //
- //}
复制代码- #include "stm32f10x.h"
- #include "spi.h"
- //#include "./usart/bsp_usart_dma.h"
- #include "max31865.h"
- #include "lcd1602.h"
- #include "delay.h"
- #include "usart.h"
- //uint8_t read_temp_HIGH;
- //uint8_t read_temp_LOW;
- //uint16_t read_temp;
- u8 i;
- u16 s1;
- u16 s2;
- u16 s3=0;
- u32 s4=0;
- u16 s5;
- unsigned long wd=0;
- int main(void)
- {
- SystemInit();
- delay_init(); //延时函数初始化
- LCD1602_Init(); //1602初始化
- SPI2_Init(); //spi初始化
- MAX31865_Int(); //MAX初始化ADC1
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
- uart_init(115200); //串口初始化为115200
-
- while(1)
- {
-
- MAX31865_SendData(MAX31856_CONFIG_3WIRE,0xc1);
- MAX31865_SendData(MAX31856_CONFIG_REG,0xf2); //11110010
- s1=MAX31865_ReceiveData(MAX31856_RTDMSB_REG);
- s2=MAX31865_ReceiveData(MAX31856_RTDLSB_REG);
- s3=(s1<<8) | s2;
- printf("s3:%x",s3);
- // delay_ms(50);
- s3=s3>>1;
- // s3=s3&0xfffe;
-
- wd=(s3/32)-256;
- printf("wd:%d\r\n",wd);
- LCD1602_Show_Str(0,0,"WD:");
- // LCD1602_Write_Dat(wd/100%10+0x30);
- LCD1602_Write_Dat(wd/10%10+0x30);
- // LCD1602_Show_Str(5,0,".");
- LCD1602_Write_Dat(wd%10+0x30);
- LCD1602_Show_Str(9,0,"^C");
- }
- }
复制代码
所有资料51hei提供下载:
MAX31865_PT100_源代码.7z
(192.12 KB, 下载次数: 407)
max31865资料.zip
(457.42 KB, 下载次数: 183)
|