3D打印机温度读取

ADC3初始化

主控芯片为stm32f407ZG,对ADC3初始化,精度设定为12位

ADC3代码部分

void init_adc3()     /ADC3初始化
{GPIO_InitTypeDef  GPIO_InitStructure;ADC_CommonInitTypeDef ADC_CommonInitStructure;ADC_InitTypeDef       ADC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE); //使能RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC3,ENABLE);      //ADC3复位RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC3,DISABLE);       /ADC通用寄存器CCRADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;//两个采样阶段延迟5个时钟ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //DMA失能ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//四分频ADCCLK=PCLK2/4=84/4=21Mhz,ADC时钟不能超过36Mhz ADC_CommonInit(&ADC_CommonInitStructure);/初始化ADC3参数ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12位ADC_InitStructure.ADC_ScanConvMode = DISABLE;//非扫描ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//关闭连续转换ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//禁止触发检测,使用软件触发ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐    ADC_InitStructure.ADC_NbrOfConversion = 1;//1¸ADC_Init(ADC3, &ADC_InitStructure);ADC_Cmd(ADC3, ENABLE);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模拟输入GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//不带上下拉#ifdef TEMP_0_PIN                            /定义TEMP_0_PIN 或删除GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_Init(GPIOF, &GPIO_InitStructure);    #endif#ifdef TEMP_1_PIN GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;GPIO_Init(GPIOF, &GPIO_InitStructure);    #endif#ifdef TEMP_2_PIN GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_Init(GPIOF, &GPIO_InitStructure);    #endif#ifdef TEMP_BED_PIN GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;GPIO_Init(GPIOF, &GPIO_InitStructure);  #endif
}
u16 get_adc(u8 ch)//ch为通道
{    ADC_RegularChannelConfig(ADC3, ch, 1, ADC_SampleTime_480Cycles );          ADC_SoftwareStartConv(ADC3);             while(!ADC_GetFlagStatus(ADC3, ADC_FLAG_EOC ));return ADC_GetConversionValue(ADC3);
}
u16 get_adc_average(u8 ch,u8 times)//ch为通道、Times为连续读取的次数
{u32 temp_val=0;u8 t;get_adc(ch);//首次读取ADC存在误差,跳过即可for(t=0;t<times;t++){temp_val+=get_adc(ch);//delay_ms(5);省略后对精度影响不大}//printf("ch:%d,V:%d\n\r\n\r",ch,temp_val/times);return temp_val/times;
}

计数转换

首先使用的是NTC 100K热敏电阻
型号:B2-100-3950±1%
于25摄氏度下测量,电阻为100K 误差为1%
于25或50摄氏度测量,温度系数为3950 误差为1%
由公式
即B=(ln(Rt1/Rt2))/(1/T1-1/T2)
而B=3950
令T2=25摄氏度=273.15+25华氏度=298.15K,则Rt2=100K欧
计数过程保留2位有效数字
3950*(1/T1-1/298.15)=lnR1-ln100K
ln100k=11.51
3950/298.15=13.25
化简T=3950/(lnR+1.74)
检验当R=100K欧时,得到温度T=24.963,误差0.037摄氏度

ADC为12位精度
电路图如下图所示

首先令热敏电阻为R1、电压为U1
串联的电阻为R2=4700欧
热敏电阻电压U1=get_adc()3.3/4096
由电流相等得U1/R1=(3.3-U1)/4700
化简得热敏电阻R1=(4700
get_adc())/(4096-get_adc())

综上
获取温度代码为

float get_temp(u8 ch)
{u16 volt;float R,T;volt=get_adc_average(ch,5);R=(4700*volt)/(4096-volt);T=(3950/(log(R)+1.74))-273.15;printf("ch:%d,Temp:%f\n\r\n\r",ch,T);return T;
}

注意,不可在定时器内读取温度,否则会导致接收或读取的数据错乱

PWM控制部分

电路部分如下图所示



对端口PWM初始化

//注意EXTRUDERS为定义的喷头数,在相应的头文件加入:
#define EXTRUDERS 1//为定义一个喷头
void heater_pwm_init()
{GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;TIM_OCInitTypeDef  TIM_OCInitStructure;NVIC_InitTypeDef NVIC_InitStructure;GPIO_PinAFConfig(GPIOD,GPIO_PinSource12,GPIO_AF_TIM4);//热床PWM复用TIM4//                                 BED      /TIM4_CH1                              if(EXTRUDERS >0)//HEATEER 0 /TIM3_CH4///TIM8_CH3GPIO_PinAFConfig(GPIOB,GPIO_PinSource1,GPIO_AF_TIM3);//加热喷头0if(EXTRUDERS >1)//HEATEER 1 /TIM4_CH3GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_TIM4);//加热喷头1if(EXTRUDERS >2)//HEATEER 2 /TIM3_CH3///TIM8_CH2GPIO_PinAFConfig(GPIOB,GPIO_PinSource0,GPIO_AF_TIM3);//    加热喷头2    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;  //复用GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_14;GPIO_Init(GPIOD, &GPIO_InitStructure);                                                                                                                             GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;              GPIO_Init(GPIOB, &GPIO_InitStructure);  TIM_TimeBaseStructure.TIM_Prescaler=83;  TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period=499;   TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; #ifdef HEATER_0_PIN           TIM_OC4Init(TIM3, &TIM_OCInitStructure);  TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable); #endif TIM_ARRPreloadConfig(TIM3,ENABLE);//ARPE ??  #ifdef HEATER_1_PIN    TIM_OC3Init(TIM4, &TIM_OCInitStructure);  TIM_OC3PreloadConfig(TIM4,TIM_OCPreload_Enable);#endif #ifdef HEATER_2_PIN              TIM_OC3Init(TIM3, &TIM_OCInitStructure);  TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);  #endif #ifdef HEATER_BED_PIN           TIM_OC1Init(TIM4, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable); #endif TIM_ARRPreloadConfig(TIM3,ENABLE);//ARPE ?? TIM_ARRPreloadConfig(TIM4,ENABLE);//ARPE 使能TIM_Cmd(TIM3, ENABLE);TIM_Cmd(TIM4, ENABLE);
}

对于调节PWM占空比

#define  HEATER_0_PIN    TIM3->CCR4     //E0_PWM T8_2(PB0)            E0¼ÓÈÈ-PWM
#define  HEATER_1_PIN    TIM4->CCR3    //E1_PWM T8_1(PC6)            E1¼ÓÈÈ-PWM
#define  HEATER_2_PIN    TIM3->CCR3    //E2_PWM T8_1(PC6)            E2¼ÓÈÈ-PWM
#define  HEATER_BED_PIN  TIM4->CCR1    //BED_PWM T8_3(PB1)           BED¼ÓÈÈ-PWM

//直接对上述赋值即可,范围为0至65535
但是经过使用,大于500的PWM效果是一样的
或使用相应的函数
TIM_SetCompareX(TIMY,Z);
X为通道、Y为定时器、Z为占空比

stm32开发3D打印机(三)——ADC热敏电阻测温、PWM控制(已完成)相关推荐

  1. stm32开发3D打印机(二)——方向、相关资料链接

    在这编文章里,我将写下3D打印机的相关资料链接和如何运作及之后写文章的大致方向 关于3D打印机(如何diy,零件的3D模型.Arduino源代码等等).写字机器人的资料等,是从多个地方收集,总而言之有 ...

  2. stm32开发3D打印机(零)——打印板配置(未完成)

    对BIGTREETECH 的 SKR-PRO-V1.2的端口.定时器.中断等配置说明 板子如下图所示 板子相关资料在下方链接,下文就不全部截图了 链接:https://pan.baidu.com/s/ ...

  3. stm32开发3D打印机(五)——TF卡spi协议与FATFS文件系统(已完成)

    借鉴于正点原子stm32 Mini板 下方的代码仅为对TF卡的初始化 FATFS移植方法请看正点原子Mini板教程,以及建议完成USMART的移植 因为TFATFS移植与USMATRT没有什么好写的, ...

  4. stm32开发3D打印机(六)——使用FATFS文件系统读取打印文件 获取信息 执行转换 转换坐标(上)

    这篇文章为读取打印文件(后缀为gcode的文件),并添加USMART功能调试 因为TFATFS移植与USMATRT没有什么好写的,而且在下方的链接:正点原子教程已经有详细的教程了,所以跳过了TATFS ...

  5. 基于51单片机的ADC热敏电阻测温系统proteus仿真

    硬件设计 (末尾附文件) 代码设计 #include <reg51.h> #include <intrins.h> #define uchar unsigned char #d ...

  6. MLX90640测温模块开发及应用(一)测温模块应用场景

    MLX90640测温模块开发及应用(一)测温模块应用场景 随着2020年一特殊事件的爆发,全球进入了人体测温筛查的紧张阶段.国内以测温人脸机和电子哨兵为首的人体测温设备风靡全球.其测温解决方案以迈来芯 ...

  7. stm32单片机+amg8833+红外热成像/单片机红外测温成像/stm32 amg8833红外热成像

    基于stm32单片机的amg8833红外热成像/单片机红外测温成像,测温模块用的是AMG8833 IR 8x8红外热像传感器. 具体功能:可红外热成像,可以设置报警阈值,可以语音播报温度异常,单片机s ...

  8. 基于Blinker ESP8266 远程电压电流、功率计、温湿度计、ADC接口测温、温控风扇、低电压保护、低压报警功能。用来监测我的太阳能充电。SSD1306可轮番显示电压信息和温度信息。APP图表

    ESP8266系列文章目录 目录 ESP8266系列文章目录 经过不断的努力,处女之作终于做出来了.用的Arduino 经过一段时间不断熟练了,做了一些更新:2022.10.30   可以直接主页下载 ...

  9. 【原创】ESP32+NTC热敏电阻测温SD卡采集OLED显示,Begabung_TC250

    摘要 利用ESP32设计一款八通道热敏电阻采集方案,并使用SD卡采集及OLED显示,通过Arduino_IDE编写.本产品在淘宝店Begabung发售,型号:TC250. 内容         零件准 ...

最新文章

  1. 解决首次运行WebDriverAgent手机开发者未信任问题
  2. SAP 电商云 Spartacus UI 和 SmartEdit 本地测试环境
  3. n以内的素数c语言,关于求N以内素数的一点小问题(N小于一亿)
  4. 【WebRTC---源码篇】(三)Windows/Linux音视频采集封装模块
  5. flume linux 命令,flume启动命令 · Mr.Deng’s Blog
  6. Nginx——配置文件
  7. python自动执行脚本
  8. [USACO09HOL]假期绘画Holiday Painting
  9. 实验吧web-易-what a fuck!这是什么鬼东西?
  10. 跑外卖仅靠吃苦可以吗?
  11. springboot主线程_springboot中的多线程.md
  12. mysql数据表字段繁体转简体_【WORD】阿拉伯数字变大写数字、简繁体转换等实用小技巧...
  13. 点阵字库制作和使用(一)
  14. 解决You need to use a Theme.AppCompat theme (or descendant) with this activity.
  15. uniapp使用canvas画海报二维码
  16. 启动期间的内存管理之初始化过程概述----Linux内存管理(九)
  17. chrome浏览器本地信息的获取与设置
  18. JavaScript复习
  19. 瑞格科技IPO被终止:曾拟募资5.6亿 江振翔三兄弟为实控人
  20. Shading中的插值技术

热门文章

  1. python没有random模块_python-random模块
  2. 测试技术-测试策略与类型
  3. 自编码器(Auto-encoder)的概念和应用
  4. 常见的关系型数据库有哪些
  5. u盘启动盘恢复计算机,U盘启动盘怎么恢复正常普通U盘?
  6. 关于mailx邮件发不出去的解决办法
  7. 发送邮件服务器错误怎么更改,邮件发不出去 服务器错误550怎么解决?
  8. anyconnect免密码登录
  9. 测试ai模糊软件,AE/PR人工智能自动人脸检测马赛克模糊插件
  10. 饥荒linux服务器搭建