本文介绍如何用STM32来实现温度控制系统仿真,如果看完你还不会各种测试,那你真的没救了
准备
仿真软件:Proteus 8.9
自行去 https://www.zdfans.com/ 搜索,Proteus
下载,并安装,汉化,注意要安装在C盘根目录
Proteus配置
本文以软件自带的Oven来实现温度反馈控制。
添加STM32F103C6模块,LM016L液晶屏模块,一个黄色LED,一个绿色LED,两个100欧姆电阻,一个继电器开关,一对123k和5k的分压电阻,以及Oven模块。
如果嫌麻烦可以在这里下载我添加完成的:下载
添加完成后,连线如图所示,注意ad网标的设置。
到这里先告一段落
STM32流程
通过STM32的自带的ADC获取温度,与设定值进行比较后,通过IO口控制Oven的电源驱动,从而实现负反馈。与此同时,STM32还需要控制液晶屏的信息显示。
请先下载程序代码:下载
首先使用STM32CubeMX(下载) 打开ATest.ioc。
前面都已配置完成,跳转到Project Manager,选择你喜欢的IDE进行STM32程序开发。
打开工程,先进行显示器控制的开发,代码在程序包中有,因此这里只做节选说明
void printFloat(float value) { int tmp,tmp1; tmp = (int)value; tmp1=(int)((value-tmp)*10)%10; sprintf(&buff[0],“%d.%drn”,tmp,tmp1); } 因为程序由于一些原因不能打印浮点数,这里做一个浮点数的打印
void Delay_us(uint16_t us) { uint16_t differ=0xffff-us-5; //设定定时器计数器起始值 __HAL_TIM_SET_COUNTER(&htim3,differ); HAL_TIM_Base_Start(&htim3); //启动定时器 while(differ《0xffff-6) //补偿,判断 differ=__HAL_TIM_GET_COUNTER(&htim3); //查询计数器的计数值 HAL_TIM_Base_Stop(&htim3); } 这里是延迟函数
void LcdWriteCom(uint8_t com) { Delay_us(20); GPIOA-》BSRR = 0x00ff0000; GPIOA-》BSRR = (com); HAL_GPIO_WritePin(GPIOA,GPIO_PIN_15,GPIO_PIN_RESET); //LCDRS HAL_GPIO_WritePin(GPIOA,GPIO_PIN_14,GPIO_PIN_RESET); //LCDRW HAL_GPIO_WritePin(GPIOA,GPIO_PIN_13,GPIO_PIN_RESET); //LCDEN Delay_us(10); HAL_GPIO_WritePin(GPIOA,GPIO_PIN_13,GPIO_PIN_SET); //LCDEN Delay_us(10); HAL_GPIO_WritePin(GPIOA,GPIO_PIN_13,GPIO_PIN_RESET); //LCDEN Delay_us(10); } 这里是液晶屏控制命令的函数,按照液晶屏的协议将控制命令写入液晶屏
void LcdWriteDate(uint8_t date) { Delay_us(20); GPIOA-》BSRR = 0x00ff0000; GPIOA-》BSRR = (date); HAL_GPIO_WritePin(GPIOA,GPIO_PIN_15,GPIO_PIN_SET); //LCDRS HAL_GPIO_WritePin(GPIOA,GPIO_PIN_14,GPIO_PIN_RESET); //LCDRW HAL_GPIO_WritePin(GPIOA,GPIO_PIN_13,GPIO_PIN_RESET); //LCDEN Delay_us(10); HAL_GPIO_WritePin(GPIOA,GPIO_PIN_13,GPIO_PIN_SET); //LCDEN Delay_us(10); HAL_GPIO_WritePin(GPIOA,GPIO_PIN_13,GPIO_PIN_RESET); //LCDEN Delay_us(10); } 这里是液晶屏数据命令的函数,当写入数据时,将会使液晶屏在指针位置显示字符
void LCD1602Init(void) { uint8_t index=0; HAL_Delay(100); LcdWriteCom(0x38); //设置16*2显示,8位数据接口 LcdWriteCom(0x0c); //开显示,显示光标且闪烁 LcdWriteCom(0x06);//写一个指针自动加一 LcdWriteCom(0x01);//清屏 HAL_Delay(100);//延时一段时间时间,等待LCD1602稳定 LcdWriteCom(0x80);//设置第一行 数据地址指针 for(index=0;index《13;index++) LcdWriteDate(table1[index]); //写入数据 } 这里是液晶屏初始化函数,将第一行写入“Temperature:”
void LCD1602WriteCommand(uint8_t comm) { LcdWriteCom(0xc0 + 14); LcdWriteDate(comm); //写入数据 } 这里是液晶屏命令函数
下面介绍主函数,凡是自己的代码都要在对应USER CODE中添加
初始化变量
初始化ADC,液晶屏
这里首先采集了ADC读数,随后调用printFloat将浮点数转为字符串,接着将字符串打印到第二行进行显示。随后根据现在的ADC读数来判断是否需要继续加热。这里设定温度为30度。
程序完成了,点击编译,生成hex文件。
运行
在Proteus中双击STM32部件,打开属性,添加hex文件,点击OK
对于MDK,hex路径在工程的MDK-ARMATestATest.hex
点击左下角运行,开始仿真
可见程序开始正常运行了。
但是会发现温度有时超过限制,而且比较慢,会上下抖动比较大,这里推荐使用PWM进行控制,效果最好,将在以后进行介绍。
本文介绍如何用STM32来实现温度控制系统仿真,如果看完你还不会各种测试,那你真的没救了
准备
仿真软件:Proteus 8.9
自行去 https://www.zdfans.com/ 搜索,Proteus
下载,并安装,汉化,注意要安装在C盘根目录
Proteus配置
本文以软件自带的Oven来实现温度反馈控制。
添加STM32F103C6模块,LM016L液晶屏模块,一个黄色LED,一个绿色LED,两个100欧姆电阻,一个继电器开关,一对123k和5k的分压电阻,以及Oven模块。
如果嫌麻烦可以在这里下载我添加完成的:下载
添加完成后,连线如图所示,注意ad网标的设置。
到这里先告一段落
STM32流程
通过STM32的自带的ADC获取温度,与设定值进行比较后,通过IO口控制Oven的电源驱动,从而实现负反馈。与此同时,STM32还需要控制液晶屏的信息显示。
请先下载程序代码:下载
首先使用STM32CubeMX(下载) 打开ATest.ioc。
前面都已配置完成,跳转到Project Manager,选择你喜欢的IDE进行STM32程序开发。
打开工程,先进行显示器控制的开发,代码在程序包中有,因此这里只做节选说明
void printFloat(float value) { int tmp,tmp1; tmp = (int)value; tmp1=(int)((value-tmp)*10)%10; sprintf(&buff[0],“%d.%drn”,tmp,tmp1); } 因为程序由于一些原因不能打印浮点数,这里做一个浮点数的打印
void Delay_us(uint16_t us) { uint16_t differ=0xffff-us-5; //设定定时器计数器起始值 __HAL_TIM_SET_COUNTER(&htim3,differ); HAL_TIM_Base_Start(&htim3); //启动定时器 while(differ《0xffff-6) //补偿,判断 differ=__HAL_TIM_GET_COUNTER(&htim3); //查询计数器的计数值 HAL_TIM_Base_Stop(&htim3); } 这里是延迟函数
void LcdWriteCom(uint8_t com) { Delay_us(20); GPIOA-》BSRR = 0x00ff0000; GPIOA-》BSRR = (com); HAL_GPIO_WritePin(GPIOA,GPIO_PIN_15,GPIO_PIN_RESET); //LCDRS HAL_GPIO_WritePin(GPIOA,GPIO_PIN_14,GPIO_PIN_RESET); //LCDRW HAL_GPIO_WritePin(GPIOA,GPIO_PIN_13,GPIO_PIN_RESET); //LCDEN Delay_us(10); HAL_GPIO_WritePin(GPIOA,GPIO_PIN_13,GPIO_PIN_SET); //LCDEN Delay_us(10); HAL_GPIO_WritePin(GPIOA,GPIO_PIN_13,GPIO_PIN_RESET); //LCDEN Delay_us(10); } 这里是液晶屏控制命令的函数,按照液晶屏的协议将控制命令写入液晶屏
void LcdWriteDate(uint8_t date) { Delay_us(20); GPIOA-》BSRR = 0x00ff0000; GPIOA-》BSRR = (date); HAL_GPIO_WritePin(GPIOA,GPIO_PIN_15,GPIO_PIN_SET); //LCDRS HAL_GPIO_WritePin(GPIOA,GPIO_PIN_14,GPIO_PIN_RESET); //LCDRW HAL_GPIO_WritePin(GPIOA,GPIO_PIN_13,GPIO_PIN_RESET); //LCDEN Delay_us(10); HAL_GPIO_WritePin(GPIOA,GPIO_PIN_13,GPIO_PIN_SET); //LCDEN Delay_us(10); HAL_GPIO_WritePin(GPIOA,GPIO_PIN_13,GPIO_PIN_RESET); //LCDEN Delay_us(10); } 这里是液晶屏数据命令的函数,当写入数据时,将会使液晶屏在指针位置显示字符
void LCD1602Init(void) { uint8_t index=0; HAL_Delay(100); LcdWriteCom(0x38); //设置16*2显示,8位数据接口 LcdWriteCom(0x0c); //开显示,显示光标且闪烁 LcdWriteCom(0x06);//写一个指针自动加一 LcdWriteCom(0x01);//清屏 HAL_Delay(100);//延时一段时间时间,等待LCD1602稳定 LcdWriteCom(0x80);//设置第一行 数据地址指针 for(index=0;index《13;index++) LcdWriteDate(table1[index]); //写入数据 } 这里是液晶屏初始化函数,将第一行写入“Temperature:”
void LCD1602WriteCommand(uint8_t comm) { LcdWriteCom(0xc0 + 14); LcdWriteDate(comm); //写入数据 } 这里是液晶屏命令函数
下面介绍主函数,凡是自己的代码都要在对应USER CODE中添加
初始化变量
初始化ADC,液晶屏
这里首先采集了ADC读数,随后调用printFloat将浮点数转为字符串,接着将字符串打印到第二行进行显示。随后根据现在的ADC读数来判断是否需要继续加热。这里设定温度为30度。
程序完成了,点击编译,生成hex文件。
运行
在Proteus中双击STM32部件,打开属性,添加hex文件,点击OK
对于MDK,hex路径在工程的MDK-ARMATestATest.hex
点击左下角运行,开始仿真
可见程序开始正常运行了。
但是会发现温度有时超过限制,而且比较慢,会上下抖动比较大,这里推荐使用PWM进行控制,效果最好,将在以后进行介绍。
举报