基于PIC微控制器的智能温控仪设计与实现

版权申诉
0 下载量 84 浏览量 更新于2024-11-09 收藏 4KB ZIP 举报
资源摘要信息:"本资源涉及基于PIC 8位微控制器的智能温控仪设计,重点介绍PIC微控制器的中断系统、定时器功能以及模拟到数字(AD)转换功能。通过对该资源的学习和使用,读者可以深入了解PIC微控制器的工作机制,并掌握其在智能温控系统中的应用。" 知识点: 1. PIC微控制器基础: - PIC(Peripheral Interface Controller)微控制器是由美国微芯科技公司(Microchip Technology Inc.)开发的一系列8位微控制器。它们广泛应用于嵌入式系统设计中,因其简单、高效、价格合理而受到开发者的青睐。 - PIC微控制器的内部结构包括处理器核心、存储器(程序存储器和数据存储器)、输入/输出端口(I/O ports)、定时器/计数器、中断系统、串行通信接口以及模拟到数字转换器(ADC)等。 2. PIC中断系统: - PIC微控制器的中断系统是其核心功能之一,允许微控制器在检测到特定事件(如输入/输出端口状态改变、定时器溢出、外部中断信号等)时,暂时中止当前程序执行,跳转到中断服务程序进行处理。 - 中断源可以是内部(如定时器中断)或外部(如外部信号触发的中断)。 - PIC中断系统的设计允许中断优先级的设置,确保关键事件得到及时响应。 - 中断服务程序执行完毕后,通过执行返回指令(如RETFIE)返回到主程序继续执行。 3. 定时器功能: - PIC微控制器的定时器模块用于计时和计数,它可以帮助实现定时中断、延时操作和定时任务执行等功能。 - 定时器可以配置为不同的模式,如定时模式、计数模式、分频器模式等。 - 定时器可以被配置为产生定时中断,当中断发生时,CPU会暂停当前任务,跳转到定时器中断服务程序执行定时任务。 4. AD转换功能: - PIC微控制器内置的模拟到数字转换器(ADC)模块能够将模拟信号转换为数字信号,使得微控制器能够处理来自温度传感器等模拟信号源的数据。 - ADC模块通常支持多种通道输入,用户可以通过编程选择不同的输入通道。 - ADC模块的分辨率可配置,常见的有8位、10位等,分辨率越高,转换得到的数字信号精度越高。 - 转换过程中的采样率和精度可以通过编程调整,以适应不同的应用场景和性能要求。 5. 智能温控仪设计: - 智能温控仪是一个典型的嵌入式系统应用,利用PIC微控制器来实现温度的实时监测和控制。 - 系统可能包含温度传感器,如NTC热敏电阻或数字温度传感器,通过ADC模块读取温度值。 - 控制策略可以通过程序实现,如PID控制算法,根据温度读数调节加热或冷却设备的开关。 - 系统还可能包括用户接口,如显示屏和按键,用于设定目标温度、查看实时温度和其他参数。 6. 文件名解析: - TEMP_DIS.ASM:这个文件名暗示了这是一个汇编语言(ASM)源代码文件,用于PIC微控制器的编程。文件可能包含温控仪的核心程序代码,如中断服务例程、AD转换处理、定时器控制逻辑等。 ***.txt:此文件名表明可能是一个纯文本文件,可能包含与项目相关的说明、文档、版权信息或者是从***网站下载的资源说明。PUDN是一个国内的编程文档共享平台,该文件可能包含了下载链接、引用说明或者其他与项目相关的参考资料。

void PWM_THREAD(void* arg) { uint16_t t = 0; uint16_t key = 0; adc_init(); /* 初始化ADC */ chanl_init(); atmr_tmrx_npwm_chy_init(AUTOLOAD - 1, PRE_DIVIDER - 1); /* 初始化高级定时器PWM输出模式 */ dsp_mos_init(); dsp_rd_init(); DSP_MOS1(1); DSP_MOS2(1); DSP_MOS3(1); DSP_MOS4(1); Temp_data.pwm_ch=5; Temp_data.pwmdutyr=AUTOLOAD/4; // Temp_data.mos_ch = 2; Temp_data.mos_enable = 1; while (1) { osMutexAcquire(tempmutex,osWaitForever); key++; /* 输出5个PWM波(控制TMR8_CH1, 即PC6输出5个脉冲) */ t++; osDelay(1); if (t >= 10) /* 控制LED0闪烁, 提示程序运行状态 */ { t = 0; atmr_tmrx_npwm_chy_set(100); /* 高级定时器设置输出PWM个数 最多255个*/ } if(key>2000) { key=0; if(Temp_data.pwm_ch > 5) Temp_data.pwm_ch=0; Temp_data.tempmax = Temp_data.test_temp[0]; for(uint8_t i =0;i<8;i++) { if(Temp_data.test_temp[i]>Temp_data.tempmax) Temp_data.tempmax = Temp_data.test_temp[i]; } if(Temp_data.receivebuf[1]==WRITEDUTYR||(dutyr>0&&dutyr<AUTOLOAD)) { sutyrcrc = crc16_modbus(Temp_data.receivebuf,6); dutyrcrc_H = (uint16_t)((sutyrcrc&0xFF00)>>8); dutyrcrc_L = (uint16_t)(sutyrcrc&0x00FF); if((dutyrcrc_H == Temp_data.receivebuf[6])&&(dutyrcrc_L == Temp_data.receivebuf[7])) { pwmdutyr_H = (uint16_t)(Temp_data.receivebuf[4]&0xFF00); pwmdutyr_L = (uint16_t)Temp_data.receivebuf[5]; Temp_data.pwmdutyr = (pwmdutyr_H<<8)|pwmdutyr_L; if(Temp_data.pwmdutyr>AUTOLOAD) { Temp_data.pwmdutyr=AUTOLOAD; } if(Temp_data.pwmdutyr==0) { Temp_data.pwmdutyr=(AUTOLOAD/100)*20; } pwm_start(Temp_data.pwmdutyr,Temp_data.pwm_ch); } else if(dutyr>0&&dutyr<AUTOLOAD) { Temp_data.pwmdutyr = dutyr; pwm_start(Temp_data.pwmdutyr,Temp_data.pwm_ch); } } else { if(Temp_data.tempmax>25) { Temp_data.pwmdutyr = (uint32_t)(Temp_data.tempmax*2); pwm_start(Temp_data.pwmdutyr,Temp_data.pwm_ch); } else if(Temp_data.tempmax<25) { Temp_data.pwmdutyr=(AUTOLOAD/100)*20; pwm_start(Temp_data.pwmdutyr,Temp_data.pwm_ch); } else if(Temp_data.tempmax>50) { Temp_data.pwmdutyr = AUTOLOAD; pwm_start(Temp_data.pwmdutyr,Temp_data.pwm_ch); } // Temp_data.pwm_RD[Temp_data.pwm_ch-1] = readfault_channel(Temp_data.pwm_ch); } readRD(Temp_data.pwm_RD); } osMutexRelease(tempmutex); } },解析这段代码

2023-07-15 上传

void app_rs485_thread(void *arg) { uint32_t var_displace; uint16_t crcsenddata; Temp_data.baudrate = 115200; rs485_init(Temp_data.baudrate); while(1) { osMutexAcquire(tempmutex,osWaitForever); rs485_receive_data(Temp_data.receivebuf,&Temp_data.rs485_receivelen); if(Temp_data.rs485_receivelen>0&&Temp_data.rs485_receivelen<RS485_BUFLEN) { if (Temp_data.receivebuf[1] == WRITEBAUDRATE) { uint16_t baudratecrc = crc16_modbus(Temp_data.receivebuf,6); uint16_t baudratecrc_H = (uint16_t)((baudratecrc&0xFF00)>>8); uint16_t baudratecrc_L = (uint16_t)(baudratecrc&0x00FF); if((baudratecrc_H == Temp_data.receivebuf[6])&&(baudratecrc_L == Temp_data.receivebuf[7])) { uint16_t baudrate_H = (uint16_t)(Temp_data.receivebuf[4]&0xFF00); uint16_t baudrate_L = (uint16_t)Temp_data.receivebuf[5]; Temp_data.baudrate = (baudrate_H<<8)|baudrate_L; rs485_init(Temp_data.baudrate); } } else if (Temp_data.receivebuf[1] == READTEMPDATA) { crcreceivedata = crc16_modbus(Temp_data.receivebuf,Temp_data.rs485_receivelen-2); if(((uint8_t)((crcreceivedata&0xFF00)>>8) == Temp_data.receivebuf[Temp_data.rs485_receivelen-2])&&((uint8_t)(crcreceivedata&0xFF) == Temp_data.receivebuf[Temp_data.rs485_receivelen-1])) { Temp_data.sendbuf[0] = 0x01;//addr Temp_data.sendbuf[1] = 0x03;//Function code Temp_data.sendbuf[2] = 0x00; Temp_data.sendbuf[3] = 0x08; temp485_send = (uint32_t)(Temp_data.tempmax*10000); for(uint8_t i =4;i<8;i++) { var_displace = (7-i)*8; Temp_data.sendbuf[i] = (uint8_t)((temp485_send&(0xFF<<var_displace))>>var_displace);//i=4 1111 1111<<(3*8)24 = 1111 1111 0000 0000 0000 0000 0000 0000 } for(uint8_t i =8;i<12;i++) { Temp_data.sendbuf[i] = Temp_data.pwm_RD[i-8]; } crcsenddata = crc16_modbus(Temp_data.sendbuf,12); Temp_data.sendbuf[12] = (crcsenddata&0xFF00)>>8; Temp_data.sendbuf[13] = (crcsenddata&0xFF); osDelay(500); rs485_send_data(Temp_data.sendbuf,14); osDelay(500); } } } osMutexAcquire(tempmutex,osWaitForever); } },解析这段代码

2023-07-15 上传