你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【STM32C0评测】3、基于Nucleo-c031c6开发板的MAX6675温度采集实验

[复制链接]
cenry 发布时间:2024-4-11 10:35

本次测评主要围绕前期申请的类目展开,本次测评基于自主开发的MAX6675热电偶温度采集模块展开,通过uart进行上下位机通讯。

一、STM32CubeMX调试

本次调试主要围绕几项需要用到的硬件展开,分别是SPI通讯口,UART通讯口和按键口,PC13;PA1、PA2(UART2);PA5、PA6、PA7、PB0(SPI1)。

image.png

具体调试参数如下图,这里需要根据自己需求展开:

(一)UART参数设置:

image.png

(二)SPI参数设置

image.png

image.png

(三)时钟设置

image.png

设置完成后,即可生成代码进行软件调试。

二、软件程序调试

主程序:

int main(void)

{

/ USER CODE BEGIN 1 /

float K_Temperature ; //K型热电偶 温度值

HAL_Init();

SystemClock_Config();

MAX6675_Init(); //K型热电偶初始化

/ USER CODE END 1 /

/ MCU Configuration--------------------------------------------------------/

/ Reset of all peripherals, Initializes the Flash interface and the Systick. /

HAL_Init();

/ USER CODE BEGIN Init /

/ USER CODE END Init /

/ Configure the system clock /

SystemClock_Config();

/ USER CODE BEGIN SysInit /

/ USER CODE END SysInit /

/ Initialize all configured peripherals /

MX_GPIO_Init();

MX_SPI1_Init();

MX_USART2_UART_Init();

/ USER CODE BEGIN 2 /

/ USER CODE END 2 /

/ Infinite loop /

/ USER CODE BEGIN WHILE /

while (1)

{

/ USER CODE END WHILE /

/ USER CODE END WHILE /

 K_Temperature =

MAX6675_ReadTemperature(); //读取热电偶温度值

      //K_temp

= K_Temperature*100;

 HAL_Delay(500);



      unsigned

char str[1];//接收数据存放位置

      printf("%f\r\n",

K_Temperature);//搞定

      //HAL_UART_Transmit(&huart2,str,10,0xffff);//串口接收数据        



      //串口接收完成的中断回调函数



      //HAL_UART_Transmit(&huart2,str,sizeof(str),0xffff);

//HAL_UART_Transmit(&huart2,(uint8_t *)"测\r",sizeof("测\r"),0xffff);

/ USER CODE BEGIN 3 /

}

/ USER CODE END 3 /

}

MAX6675子程序:

//MAX6675 片选引脚初始化

void GPIO_Init(void)

{

GPIO_InitTypeDef GPIO_InitStruct = {0};

/ GPIO Ports Clock Enable /

__HAL_RCC_GPIOB_CLK_ENABLE();

HAL_GPIO_WritePin(GPIOB, MAX6675_CS_Pin, GPIO_PIN_SET);

/引脚配置 /

GPIO_InitStruct.Pin = MAX6675_CS_Pin;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

}

/**

@brief max66675模块初始化

@param None

@retval None

*/

void MAX6675_Init(void)

{

GPIO_Init(); //片选引脚初始化

MX_SPI1_Init(); //spi总线初始化

}

/**

@brief max6675模块读写一个字节的数据

@param txData:要发送的数据

@retval 接收到的数据

*/

uint8_t MAX6675_ReadWriteByte(uint8_t txData)

{

unsigned char txdata,rxdata;

txdata = txData;

HAL_SPI_TransmitReceive(&hspi1,&txdata,&rxdata,1,1000);

return rxdata;

}

/**

@brief max6675模块读取测得的原始数据

@param None

@retval 温度的原始数据

*/

uint16_t MAX6675_ReadRawValue(void)

{

uint16_t tmp;

MAX6675_CS(0);

tmp = MAX6675_ReadWriteByte(0xff); //read MSB

//printf("%d\n\r",tmp); tmp <<= 8;

tmp |= MAX6675_ReadWriteByte(0xff); //read LSB

//printf("%d\n\r",tmp);

MAX6675_CS(1);

if (tmp & 4)

{

// thermocouple open

tmp = 4095; //未检测到热电偶

}

else

{

tmp = tmp >> 3;

}

//printf("%d\n\r",tmp); return tmp;

}

/**

@brief max6675模块读取温度

@param None

@retval 温度值(单位:℃)

*/

float MAX6675_ReadTemperature(void)

{

return (MAX6675_ReadRawValue() * 1024.0 / 4096);

}

//MAX6675 片选控制

void MAX6675_CS(unsigned char choose)

{

if(choose == 1)

{

HAL_GPIO_WritePin(GPIOB, MAX6675_CS_Pin, GPIO_PIN_SET);

}

else

{

HAL_GPIO_WritePin(GPIOB, MAX6675_CS_Pin, GPIO_PIN_RESET);

}

}

/**

@brief SPI1 Initialization Function

@param None

@retval None

*/

static void MX_SPI1_Init(void)

{

/ USER CODE BEGIN SPI1_Init 0 /

/ USER CODE END SPI1_Init 0 /

/ USER CODE BEGIN SPI1_Init 1 /

/ USER CODE END SPI1_Init 1 /

/ SPI1 parameter configuration/

hspi1.Instance = SPI1;

hspi1.Init.Mode = SPI_MODE_MASTER;

hspi1.Init.Direction = SPI_DIRECTION_2LINES;

hspi1.Init.DataSize = SPI_DATASIZE_8BIT;

hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;

hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;

hspi1.Init.NSS = SPI_NSS_SOFT;

hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;

hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;

hspi1.Init.TIMode = SPI_TIMODE_DISABLE;

hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;

hspi1.Init.CRCPolynomial = 7;

hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;

hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;

if (HAL_SPI_Init(&hspi1) != HAL_OK)

{

Error_Handler();

}

/ USER CODE BEGIN SPI1_Init 2 /

/ USER CODE END SPI1_Init 2 /

}

/**

@brief This function is executed in case of error occurrence.

@retval None

*/

void Error_Handler(void)

{

/ USER CODE BEGIN Error_Handler_Debug /

/ User can add his own implementation to report the HAL error return state /

__disable_irq();

while (1)

{

}

/ USER CODE END Error_Handler_Debug /

}

/特别注意/

采用系统自带UART传输数值类型数据时会存在乱码等问题,这里我采用重定向的方法解决,代码如下

int fputc(int ch, FILE *f)

{

HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xffff);

return ch;

}

int fgetc(FILE *f)

{

uint8_t ch = 0;

HAL_UART_Receive(&huart2, &ch, 1, 0xffff);

return ch;

}

三、心得体会分享

最后就是实验结果啦,如图所示:

image.png

模块图:

image.pngimage.png

PS:采集的温度为室温条件下和手捏住热电偶的温度,该温度没有经过校准等处理,直接输出MAX6675反馈的数字量。

好啦,分享基本上到这里就告一段落啦,还是非常感谢主办方给予的宝贵机会,后面有机会还会继续尝试,继续分享,会去继续做实验啦!

image.png
收藏 评论0 发布时间:2024-4-11 10:35

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版