完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最近在项目中用到了热电偶测量温度,选用了处理芯片max6675,它的通信方式是SPI,调试之初先用STM32的硬件SPI方式对其进行了调试,测得的温度值较为准确,但是由于在项目中要同时测量四路温度,而max6675只能处理一路热电偶值,于是想到了用软件模拟SPI的方式读取温度值,但是读取得温度值一直不对(不变或偏的离谱),麻烦用过这个芯片的朋友和路过的大神帮忙看看,万分感谢!!!
以下是stm32用模拟SPI的方式来读取温度的程序: //SPI SCK引脚 #define SPI_CLK_GPIO GPIOE #define SPI_CLK_PIN GPIO_Pin_6 //SPI 数据引脚 #define SPI_MISO_GPIO GPIOE #define SPI_MISO_PIN GPIO_Pin_5 //SPI 片选信号引脚 #define SPI_CS_GPIO GPIOE #define SPI_CS_PIN GPIO_Pin_4 #define MAX6675_CSL() GPIO_ResetBits(SPI_CS_GPIO, SPI_CS_PIN) #define MAX6675_CSH() GPIO_SetBits(SPI_CLK_GPIO, SPI_CLK_PIN) #define SPI_CLK_L GPIO_ResetBits(SPI_CLK_GPIO, SPI_CLK_PIN) #define SPI_CLK_H GPIO_SetBits(SPI_CLK_GPIO, SPI_CLK_PIN) #define SPI_SDO GPIO_ReadInputDataBit(SPI_MISO_GPIO, SPI_MISO_PIN) unsigned int Temperature_Spi_Read(void) { unsigned int j; unsigned char i; j = 0; MAX6675_CSL(); for (i = 0; i < 16; i++) { SPI_CLK_H; j = (j <<1); if ( SPI_SDO==1) j = j | 0x01; SPI_CLK_L; __nop(); } MAX6675_CSH(); return j; } void SPI_MAX6675_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; SPI_InitTypeDef SPI_InitStructure; //使能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_6; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出 GPIO_Init(GPIOE, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入 GPIO_Init(GPIOE, &GPIO_InitStructure); MAX6675_CSH();//拉高CS SPI_CLK_L; //置低SCK } int main (void) { unsigned int t,i; unsigned char c; unsigned char flag; float temprature; /*系统时钟72M */ SystemInit(); /* MAX6675 初始化*/ SPI_MAX6675_Init(); USART1_Config(); while(1) { i=Temperature_Spi_Read(); flag = i&0x04; //flag保存了热电偶的链接状态 t = i<<1; t = t>>4; temprature = t*0.25; if(i!=0) //max6675有数据返回 { if(flag==0) //热电偶已连接 { printf("当前温度是%4.2f¡£rn",i,temprature); } else 热电偶掉线 { printf("热电偶掉线"); } } else //max6675没有数据返回 { printf("max6675没有数据返回"); } delay_1S(1);//两次转换之间间隔1s } } |
|
相关推荐 |
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1435 浏览 1 评论
3297 浏览 1 评论
8152 浏览 0 评论
1967 浏览 0 评论
VL53L5CX #高达 8x8 多区域测距和 63°对角线宽视场 飞行时间多区域测距传感器
17362 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 23:47 , Processed in 0.690665 second(s), Total 70, Slave 54 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号