Блок контроля и регулирования температуры пояльного жала на микроконтроллере на языке C/C++

Заказать уникальную курсовую работу
Тип работы: Курсовая работа
Предмет: Микроконтроллеры
  • 31 31 страница
  • 5 + 5 источников
  • Добавлена 22.01.2024
1 496 руб.
  • Содержание
  • Часть работы
  • Список литературы
ВВЕДЕНИЕ 2
1. ГЛАВА 1 ОБЗОР СУЩЕСТВУЮЩИХ РЕШЕНИЙ 3
2. ГЛАВА 2 ФУНКЦИОНАЛЬНАЯ И ПРИНЦИПИАЛЬНАЯ ЭЛЕКТРИЧЕСКАЯ СХЕМЫ УСТРОЙСТВА 17
3. ГЛАВА 3 АЛГОРИТМ РАБОТЫ МИКРОКОНТРОЛЛЕРА И ОСНОВНЫЕ УЗЛЫ УСТРОЙСТВА 20
4. ГЛАВА 4 РЕЗУЛЬТАТЫ ИССЛЕДОВАНИЙ 21
ЗАКЛЮЧЕНИЕ 22
СПИСОК ЛИТЕРАТУРЫ 23
ПРИЛОЖЕНИЕ А ФУНКЦИОНАЛЬНАЯ СХЕМА 24
ПРИЛОЖЕНИЕ Б ПРИНЦИПИАЛЬНАЯ СХЕМА 25
ПРИЛОЖЕНИЕ В КОД МИКРОКОНТРОЛЛЕРА 26
Фрагмент для ознакомления

СПИСОК ЛИТЕРАТУРЫМатюшов, Н.В. Начало работы с микроконтроллерами STM8 / Н.В. Матюшов. - М.: Солон-пресс, 2016. - 208 c.Богомолов, С.А. Основы электроники и цифровой схемотехники: Учебник / С.А. Богомолов. - М.: Academia, 2018. - 208 c.Игумнов, Д.В. Основы полупроводниковой электроники: Учебное пособие для вузов / Д.В. Игумнов, Г.П. Костюнина. - М.: РиС, 2015. - 394 c.Штеренлихт, Д.В. Электротехника и основы электроники: Учебное пособие / Д.В. Штеренлихт. - СПб.: Лань П, 2016. - 432 c.AtollicTrueSTUDIO Электронный ресурс URL:https://www.st.com/en/development-tools/truestudio.htmlSTM8S003F3 Электронный ресурс URL:https://www.st.com/resource/en/datasheet/stm8s003f3.pdfЯзык программирования Си Электронный ресурс URL:http://www.r-5.org/files/books/computers/languages/c/kr/Brian_Kernighan_Dennis_Ritchie-The_C_Programming_Language-RU.pdfПРИЛОЖЕНИЕ А ФУНКЦИОНАЛЬНАЯ СХЕМАПРИЛОЖЕНИЕ Б ПРИНЦИПИАЛЬНАЯ СХЕМАПРИЛОЖЕНИЕ В КОД МИКРОКОНТРОЛЛЕРАhw.h#include"stm8s.h"// портвнешнегопрерыванияпопереходунуля, дляформированиясигналовнанагревателель// используетсяисходныйсигнал 50Гц, которыйпреобразуется в прямоугольныеимпульсы#define PIN_ZERO_DT_PORT GPIOD#define PIN_ZERO_DT GPIO_PIN_3#define CROSS_ZERO_DT_EXTI_RF 0b11000000// пинпереключателя#defineBTN_SW_GPP GPIOC#defineBTN_SW_Pin GPIO_PIN_6// светодиодыиндикациятемепературы#defineLED_Port GPIOC#defineLED_Pins GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5#defineLED_Pins_mask 0b11000111#defineTurnOffLedsLED_Port->ODR &= LED_Pins_mask;#defineTurnOnLed(val) LED_Port->ODR &= LED_Pins_mask; LED_Port->ODR ^= (val<<3);//упарвлениенагревателем#defineHeaterGPP GPIOD#defineHeaterPin GPIO_PIN_4#define HEATER_ON HeaterGPP->ODR &= ~HeaterPin#define HEATER_OFF HeaterGPP->ODR |= HeaterPin//датчиктемпературы#define TEMPERATURE_ADC_CH ADC1_CHANNEL_3voidHW_Init(void);hw.c#include"hw.h"voidGPIO_Config() {//конфигурацияпинапереходачерез 0 (дляформирования ШИМ)//переходчерез 0 используетсядляминимизациинагрузкинауправляющийсимисторPIN_ZERO_DT_PORT->DDR &= ~PIN_ZERO_DT;//входPIN_ZERO_DT_PORT->CR2 |= PIN_ZERO_DT;//использоватькаквходвнешнегопрерывания, плавающий//конфигурацияпинапереключателянастроекуровнятемпературы BTN_SW_GPP->DDR &= ~BTN_SW_Pin;//вход BTN_SW_GPP->CR1 |= BTN_SW_Pin;//включитьподтягивающийрезистор//конфигурациявнешнихпрерыванийдлявходовпереходачерез 0(отвнешнегогенератора) и нажатияуправляющейкнопки EXTI->CR1 &= (uint8_t)(~EXTI_CR1_PAIS);//сборпрерываний EXTI->CR1 |= (uint8_t)(CROSS_ZERO_DT_EXTI_RF);//установкапопереходуиз 1 в 0//конфигурацияпиновдлясветодиоднойиндикациитемпературыLED_Port->DDR |= LED_Pins;//направлениепередачиданныхLED_Port->CR1 |= LED_Pins;//подтяжка//пинуправлениянагревателем (идетдалеенасиловой MOSFET)HeaterGPP->DDR |= HeaterPin;// устанвокатипоткрытыйколлекторHEATER_OFF;}voidTIM4_Config() {TIM4->PSCR |= TIM4_PRESCALER_8;//установкапредделителятаймера TIM4->ARR = 0x90;//значение с учетом 17ms наработу АЦП TIM4->SR1 &= ~TIM4_SR1_UIF;//сбросфлагапрерывания (еслибылустановлен) TIM4->IER |= TIM4_IT_UPDATE;//включениепрерыванияпотаймеру}voidADC_Config(){ ADC1->CSR = ADC1_CSR_RESET_VALUE;//сброс CSR регистра ADC1->CSR |= TEMPERATURE_ADC_CH;//устанавливаемвходнойканал АЦПADC1->CR1 |= ADC1_PRESSEL_FCPU_D18;ADC1->CR2 |= ADC1_CR2_ALIGN;//настройкивыравниванияданных ADC1->CR1 |= ADC1_CR1_ADON;//включаем АЦП ADC1->CSR |= ADC1_CSR_EOCIE;//включаемгенерациюпрерыванияпозавершенииполученияданных}voidHW_Init(){_disable_irq();GPIO_Config();ADC_Config(); TIM4_Config();_enable_irq();}pid.h#include"stm8s.h"typedefstruct {int8_tdstate;//последняяпозициявходаint8_tistate;//состояниеинтергартораint8_timax, imin;//пределыинтегрированияint8_tvmax, vmin;//пределырезультатаint8_tpgain, igain, dgain; //коэффициенты ПИД регулирования} pid_struct;int8_tupdate_pid(pid_struct *pid, int8_t error, uint8_t position);pid.c#include"pid.h"int8_tupdate_pid(pid_struct *pid, int8_t error, uint8_t position) {int16_tpterm, iterm, dterm, res;//вычислениепропорциональнойчастиpterm = pid->pgain * error;//обновлениеинтеграционнойчастиpid->istate += error;if (pid->istate > pid->imax)pid->istate = pid->imax;elseif (pid->istate < pid->imin)pid->istate = pid->imin;//вычислениеинтерграциннойчастиiterm = pid->igain * pid->istate;//вычислениедифференциальнойчастиdterm = pid->dgain * (position - pid->dstate);pid->dstate = position;res = pterm + iterm - dterm;//ограничениепределамиif (res >pid->vmax)res = pid->vmax;elseif (res < pid->vmin)res = pid->vmin;return (int8_t) res;}main.c#include#include"hw.h"#include"pid.h"#defineget_flag(flagvar) (flags>>flagvar) & 1#defineset_flag(flagvar) _disable_irq(); flags |= (1< -5) && (temp_target_diff < 5)) {TurnOnLed(disp_temp_level);reset_flag(STATE_FG_BLINK_ON);}}//вычисляемошибкудляПИДрегулятораtemp_target_diff = temperature_levels_adc[active_temp_level] - conv_result;if (temp_target_diff > 127)temp_target_diff = 127;elseif (temp_target_diff < -127)temp_target_diff = -127;heat_cycles = update_pid(&pid_obj, (int8_t) (temp_target_diff),conv_result);reset_flag(STATE_FG_ADC_CONVERTION_FINISHED);}//обработканекритичныхповременисобытийif (get_flag(STATE_FG_ZERO_EVENT)) {reset_flag(STATE_FG_ZERO_EVENT);leds_blink_ticks++;//миганиесветодиодамиif (get_flag(STATE_FG_BLINK_ON)) {if ((leds_blink_ticks & 0b011111) == 0) {TurnOnLed(disp_temp_level);} elseif ((leds_blink_ticks & 0b100000) == 0) {TurnOnLed(0);}}//долгоенажатиекнопки - выключениепаяльникаif (get_flag(STATE_FG_SWITCH_BTN_PRESSED)) {btn_sw_pressed_counter++;if (btn_sw_pressed_counter == 0x90) {btn_sw_pressed_counter = 0;disp_temp_level = 0;active_temp_level = 0;TurnOnLed(0);}}//обработкакраткогонажатиякнопкиif (((BTN_SW_GPP->IDR & BTN_SW_Pin) == 0)&& ((get_flag(STATE_FG_SWITCH_BTN_PRESSED)) == 0)) {set_flag(STATE_FG_SWITCH_BTN_PRESSED);btn_sw_pressed_counter = 0;disp_temp_level = (disp_temp_level + 1) % 8;TurnOnLed(disp_temp_level);set_flag(STATE_FG_BLINK_ON);set_flag(STATE_FG_PRE_HEATER);pid_obj.pgain = pgains[disp_temp_level];pid_obj.igain = igains[disp_temp_level];if ((disp_temp_level < 7) && (disp_temp_level > 0)) {active_temp_level = disp_temp_level + 1;} else {reset_flag(STATE_FG_PRE_HEATER);reset_flag(STATE_FG_BLINK_ON);active_temp_level = disp_temp_level;}} elseif ((BTN_SW_GPP->IDR & BTN_SW_Pin)&& get_flag(STATE_FG_SWITCH_BTN_PRESSED)) {reset_flag(STATE_FG_SWITCH_BTN_PRESSED);}}}return 0;}//прерываниеповнешнемувходуvoidEXTI_IRQHandler() {set_flag(STATE_FG_ZERO_EVENT);if (PIN_ZERO_DT_PORT->IDR & PIN_ZERO_DT) {if (get_flag(STATE_FG_MEASURE_TEMP_FINISHED)) {reset_flag(STATE_FG_MEASURE_TEMP_FINISHED);if (heat_cycles) {HEATER_ON;set_flag(STATE_FG_HEATER_EN);heat_counter = heat_cycles;}} elseif (heat_counter == 0) {if (get_flag(STATE_FG_HEATER_EN)) {HEATER_OFF;reset_flag(STATE_FG_HEATER_EN);heat_counter = HEATER_OFF_CL_COUNT;}} else {heat_counter--;}} elseif ((PIN_ZERO_DT_PORT->IDR & PIN_ZERO_DT) == 0) {if ((heat_counter == 0) && (!get_flag(STATE_FG_HEATER_EN))) {//запускаем АЦПPIN_ZERO_DT_PORT->CR2 &= ~PIN_ZERO_DT;//отключаемвнешнеепрерываниедозавершенияизмеренийconv_result = 0;conv_num = 16;ADC1->CR1 |= ADC1_CR1_ADON;}}}//прерываниеАЦПvoidADC1_IRQHandler(void) {ADC1->CSR &= ~ADC1_CSR_EOC;//сбросфлагапрерывания//сохраняемрезультат в переменнойconv_result += (ADC1->DRH << 8);conv_result += ADC1->DRL;//незавергеннаборданных АЦП дляусредненияif (conv_num) {conv_num--;TIM4->CR1 |= TIM4_CR1_CEN;//включаем tim4} else {//получаемусредненноезначениеconv_result = conv_result >> 4;set_flag(STATE_FG_MEASURE_TEMP_FINISHED);set_flag(STATE_FG_ADC_CONVERTION_FINISHED);PIN_ZERO_DT_PORT->CR2 |= PIN_ZERO_DT; //включаемпрерываниеповнешнемувходу}}//обработчикпрерываниятаймераvoidTIM4_IRQHandler(void) {TIM4->SR1 &= ~TIM4_SR1_UIF;TIM4->CR1 &= ~TIM4_CR1_CEN;ADC1->CR1 |= ADC1_CR1_ADON;//запускизмеренияАЦП}

1.Матюшов, Н.В. Начало работы с микроконтроллерами STM8 / Н.В. Матюшов. - М.: Солон-пресс, 2016. - 208 c.
2.Богомолов, С.А. Основы электроники и цифровой схемотехники: Учебник / С.А. Богомолов. - М.: Academia, 2018. - 208 c.
3.Игумнов, Д.В. Основы полупроводниковой электроники: Учебное пособие для вузов / Д.В. Игумнов, Г.П. Костюнина. - М.: РиС, 2015. - 394 c.
4.Штеренлихт, Д.В. Электротехника и основы электроники: Учебное пособие / Д.В. Штеренлихт. - СПб.: Лань П, 2016. - 432 c.
5.Atollic TrueSTUDIO Электронный ресурс URL:https://www.st.com/en/development-tools/truestudio.html
6.STM8S003F3 Электронный ресурс URL:https://www.st.com/resource/en/datasheet/stm8s003f3.pdf
7.Язык программирования Си Электронный ресурс URL:http://www.r-5.org/files/books/computers/languages/c/kr/Brian_Kernighan_Dennis_Ritchie-The_C_Programming_Language-RU.pdf