找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11376|回复: 21
收起左侧

PID热电偶温控器制作 Arduino源程序(最终版)

  [复制链接]
回帖奖励 75 黑币 回复本帖可获得 3 黑币奖励! 每人限 1 次(中奖概率 50%)
ID:276685 发表于 2021-3-21 18:04 | 显示全部楼层 |阅读模式
引脚对应       avr            arduino

加热器1       PB4            10                        只能使用PB_XX端口
加热器2       PH5            8                          只能使用PH_XX端口, 详细见TIMER.h     #define

热电偶MAX6675   硬件spi
CS                PB0               53                     详细见SPIMAX6675.h,只能使用PB_XX端口

SCk              PB1               52                     不要改

S0                PB3(MISO)     50                     不要改
加热棒       12v   40W (3d打印机喷头)

PID的3个参数如果加热器相同基本不需要修改,我的参数,谦虚的说只能保持+-3度左右的一个误差,细心的网友可以继续调一调。

程序多使用寄存器操作,具体详见手册。使用arduino框架。
程序里面包括了NTC热敏电阻的ADC,软件滤波,二分查表的内容,因为那个表格兼容性不好,所以这次只使用热电偶。
有能力的网友可以更改并使用,请阅读NTC.h     #define TABLE_LONG  (列表长度)


这个程序已经连续更改3次了,点开主页看以前的。

2021_03_21_17_51_IMG_3872.JPG

2021_03_21_17_22_IMG_3870.JPG

2021_03_21_17_22_IMG_3871.JPG

2021_03_21_18_35_IMG_3874.JPG

红      pid输出
蓝      当前温度
绿      目标温度

Arduino源程序如下:
  1. #include "Arduino.h"
  2. #include "NTC.h"
  3. #include "PID.h"
  4. #include "TIMER.h"
  5. #include "DELAY.h"
  6. #include "SPI_MAX6675.h"

  7. TEMP_PID heart(7.19, 0.40, 32.4, 1, 2048);
  8. TEMP_PID bed(10, 0.023, 305.4, 0.95, 2048);

  9. NTC NTC_1(A13);
  10. NTC NTC_2(A14);
  11. float MAX;

  12. void setup(void)
  13. {
  14.   
  15.   Serial.begin(115200);
  16.   spi_init();
  17.   heart.temp_pid_change_target(200);
  18.   bed.temp_pid_change_target(0);
  19.   temp_timer_port_init();
  20.   temp_timer_on();

  21. }

  22. void loop(){
  23. MAX=spi_read_temp();
  24. delay_nms(1000);
  25.   //NTC_1.temp_ntc_read();
  26.   //NTC_2.temp_ntc_read();
  27.   /*
  28. if(Serial2.available()>6){
  29. float a=Serial2.parseFloat();
  30. float b=Serial2.parseFloat();
  31. float c=Serial2.parseFloat();

  32. heart.temp_pid_change_kp(a);
  33. heart.temp_pid_change_ki(b);
  34. heart.temp_pid_change_kd(c);
  35. Serial2.println("***********************");
  36. Serial2.println(a);
  37. Serial2.println(b);
  38. Serial2.println(c);
  39. Serial2.println("***********************");
  40.   }
  41.   */
  42. }
复制代码

所有资料51hei提供下载:
2020_2_27 PID temperature.zip (921.48 KB, 下载次数: 178)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:435676 发表于 2021-3-28 16:07 | 显示全部楼层
建议采集ADC不要用开发板自带的因为精度不高,您可以加个其他的ADS采集精度高的。可能会降低误差
回复

使用道具 举报

ID:32574 发表于 2021-4-8 21:24 | 显示全部楼层
谢谢楼主分享,这个可以用来做电烙铁吗?
回复

使用道具 举报

ID:276685 发表于 2021-4-11 14:11 | 显示全部楼层
redtxd 发表于 2021-4-8 21:24
谢谢楼主分享,这个可以用来做电烙铁吗?

可以的。不过加热器需要更换,升温,恒温。降温再调,非常耗费时间,需要耐心。如果改端口需要注意下,如#define SPI-CS-PIN。  DDRB/=(1<<SPI-CS-PIN);。这端口也仅仅限制于PBxx了。改成PAxx就需要DDRB用DDRA替换。也就是说你需要一张芯片端口图和arduino端口图,在proteus中可以找到。理论上除了硬件spi,其他端口都可以更改。
回复

使用道具 举报

ID:907804 发表于 2021-4-21 09:23 | 显示全部楼层
本帖最后由 dxxiaoyun 于 2021-4-21 15:30 编辑

下载下来的库文件头文件放怎么放到arduino IDE目录里?
我用的是继电器,不用PDI 直接温度到了动作差+0~6度。

回复

使用道具 举报

ID:907804 发表于 2021-4-21 09:24 | 显示全部楼层
我用的是继电器,不用PDI 直接温度到了动作差+0~6度。
回复

使用道具 举报

ID:276685 发表于 2021-4-24 00:17 | 显示全部楼层
dxxiaoyun 发表于 2021-4-21 09:23
下载下来的库文件头文件放怎么放到arduino IDE目录里?

您好,arduino ide。点击项目,添加文件(有的版本不能一次添加,需要操作数次)继电器根场效应管控制的最大区别就是pwm频率。单片机自带的硬件pwm频率很显然不适用,因为他频率太高了,会降低加热棒寿命。我采用ctc中断模式进行软件pwm大约7.68hz,更改中断频率就可以降低pwm频率,OCR0A寄存器和CS20/21/22。可以调整你想要的频率。
回复

使用道具 举报

ID:276685 发表于 2021-4-24 00:31 | 显示全部楼层

RE: PID热电偶温控器制作 Arduino源程序(最终版)

dxxiaoyun 发表于 2021-4-21 09:23
下载下来的库文件头文件放怎么放到arduino IDE目录里?

我用的定时器0所以是OCR0A,CS02,CS01,CS00。你如果要是新手的话先示波器看一遍波形。proteus仿真一下加热器大概了解一下,心里有底再买些材料再回来实验。
回复

使用道具 举报

ID:276685 发表于 2021-4-28 20:17 | 显示全部楼层
有部分网友反应不会添加项目文件到IDE,这里我直接分享一个全部添加好了的


PID_TEMP_2021_4_24.zip (7.78 KB, 下载次数: 46)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:934508 发表于 2021-6-8 13:59 | 显示全部楼层
您好,想问问如果测温热电偶要从max6675改到ntc100k需要改哪些参数,以及使用ramps时需要怎么接线(有没有实际接线引脚图或说明)?非常感谢!
回复

使用道具 举报

ID:276685 发表于 2021-6-9 00:00 | 显示全部楼层
liu97 发表于 2021-6-8 13:59
您好,想问问如果测温热电偶要从max6675改到ntc100k需要改哪些参数,以及使用ramps时需要怎么接线(有没有 ...



这里加热器1(加热棒)应该连接的是第10引脚也就是PB4,热敏电阻A13,A14.目前就两个加热器,理论上你可以扩展n个
NTC.h,#define TABLE_LONG  (列表长度)更改你自己的
列表展示了ADC 0~1024,对应的温度值(摄氏度)请依据实验和上拉电阻的大小灵活调整。相邻两数据进行线性插补,二分法进行快速查表。
TIMER.cpp 第77行更改如下;

   77    PWM.temp_soft_pwm1_duty=(int) heart.temp_pid_manger(NTC_1.temp_ntc_now());
   78    PWM.temp_soft_pwm2_duty=(int) bed.temp_pid_manger( NTC_2.temp_ntc_now());





main.cpp  更改成这个样子


28 //MAX=spi_read_temp();
29  delay_nms(500);




30  NTC_1.temp_ntc_read();
31  NTC_2.temp_ntc_read();











RAMPS_1.4_PIN.jpg
回复

使用道具 举报

ID:215949 发表于 2021-6-29 09:34 | 显示全部楼层
感谢楼主分享,正好在做一个需要PID温度控制的课题,参考一下
回复

使用道具 举报

ID:462629 发表于 2021-12-28 10:12 | 显示全部楼层
能改成51的吗?
回复

使用道具 举报

ID:228452 发表于 2022-4-9 01:11 | 显示全部楼层
"Can it be changed to 51?"
For 51 it is quite different  but possible..

Maybe it is time to switch to
MAX31855
K-, J-, N-, T-, S-, R-, or E-type thermocouple. The data is output in a signed 14-bit, SPI...
Thanks for code..
回复

使用道具 举报

ID:276685 发表于 2022-4-9 20:06 | 显示全部楼层
mick32 发表于 2022-4-9 01:11
"Can it be changed to 51?"
For 51 it is quite different  but possible..

首先谢谢你的建议。细心看这个程序是由许多不足的。首先这里spi通讯是针对寄存器和仪表转换芯片写的驱动,兼容性就差了许多,此外还缺少一个观察器来检测系统运行状态。遗憾的是我手头没有51系列开发板也没有这方面的编程经验,这个项目下一步会有一个自动pid校准器与可调温度曲线类似回流焊。并使用32位芯片来接替。

以下建议希望对你有帮助max31855可以使用软件spi进行通讯。你可以直接下载开源库进行通讯,然后xxx.temp_pid_manger(”A::这里直接输入一个摄氏温度即可“)计算参数后注入软件pwm占空比;。要注意的是A段程序是刷新温度.而不是!发送测量质量等待然后返回!。测量指令要在loop里面执行。
回复

使用道具 举报

ID:992285 发表于 2022-4-11 15:24 | 显示全部楼层
谢谢楼主,最近折腾PT100
回复

使用道具 举报

ID:593198 发表于 2022-10-8 09:48 | 显示全部楼层
下载了,学习一下PID.
回复

使用道具 举报

ID:1052464 发表于 2022-11-17 16:24 | 显示全部楼层
为啥库文件导不进去呀
回复

使用道具 举报

ID:276685 发表于 2022-11-21 21:36 | 显示全部楼层
小黑黑2333 发表于 2022-11-17 16:24
为啥库文件导不进去呀

是不是因为文件名称大写,或者你直接下载IDE版本的.没刷出来手动弄一下
回复

使用道具 举报

ID:1063633 发表于 2023-2-20 18:11 | 显示全部楼层
最近在学习温控,学习下
回复

使用道具 举报

ID:1087019 发表于 2023-7-3 14:51 | 显示全部楼层
最近在学习温控,学习学习
回复

使用道具 举报

ID:941557 发表于 2023-7-19 09:01 | 显示全部楼层
最近在学习PID温控,感谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表