stab.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. /* vim: set ai et ts=4 sw=4: */
  2. #ifndef __STAB_H__
  3. #define __STAB_H__
  4. //================================================================
  5. //===========Настраиваемые параметры==============================
  6. //================================================================
  7. //#define Debug // Раскомментить для дебажения
  8. //#define LED_debug // Раскомментить для вывода на светодиод сигнала управления твердотельным реле
  9. #define INTERFACE_ALT // Раскомментить для включения альтернативного интерфейса с большими символами
  10. #define High_level_triac // Раскомментить, если твердотельное реле ТЭНа управляется ВЫСОКИМ уровнем, иначе НИЗКИМ
  11. #define High_level_relay // Раскомментить, если контактное реле ТЭНа управляется ВЫСОКИМ уровнем, иначе НИЗКИМ
  12. //#define NOT_LM358 // Раскомментить, если в датчике напряжения стоит НЕ LM358, а rail-to-rail операционник
  13. //#define DisplayReset // Раскомментить, если используется вывод сброса дисплея
  14. #define DEBOUNCE 26 // Значение для обеспечения защиты от дребезга кнопок DEBOUNCE=1 + <задержка в ms>/10
  15. //
  16. //#define U_LINE_FREQ_60 // Раскомментить, если частота сети 60Гц, иначе - 50Гц
  17. //
  18. #define U_LINE 230 // Номинальное значение действующего напряжения в сети, для которого указана номинальная мощность ТЭНа
  19. #define U_MIN 100 // Значение напряжения в сети, ниже которого сеть считается аварийной
  20. #define U_LINE_Q 52900 // Квадрат номинала сети, для которого указана номинальная мощность ТЭНа
  21. //
  22. #define MENU_TIMEOUT 120 // Таймаут выхода из меню в секундах (не более 255)
  23. //
  24. //=====Настройки коммуникации по последовательному порту============
  25. #define USE_USART // Раскомментить для инициализации общения стаба с внешним контроллером
  26. #ifdef USE_USART
  27. //#define USE_RMVK // Раскомментить для включения общения с внешним контроллером по протоколу Samovar и/или РМВ-К
  28. #ifndef USE_RMVK
  29. #define USE_ADprotocol // По умолчанию используется универсальный протокол
  30. #endif
  31. #endif
  32. //==================================================================
  33. //==================================================================
  34. //
  35. #ifdef U_LINE_FREQ_60
  36. #define LINE_FREQ 129 // Определяет начальную частоту для фазовой автоподстройки частоты сети (60,1Гц)
  37. #define PSUM_MAX 60 // Количество периодов для набора отсчетов АЦП (60 - это за 1 сек, это порядка 5000 отсчетов)
  38. #define P_TIME_MAX 120 // Количество полупериодов сети в секунду для отсчета времени
  39. #else
  40. #define LINE_FREQ 155 // Определяет начальную частоту для фазовой автоподстройки частоты сети (50,08Гц)
  41. #define PSUM_MAX 50 // Количество периодов для набора отсчетов АЦП (50 - это за 1 сек, это порядка 5000 отсчетов)
  42. #define P_TIME_MAX 100 // Количество полупериодов сети в секунду для отсчета времени
  43. #endif
  44. //
  45. //=============вход АЦП================
  46. #define pin_VACin 0 // Пин входа измеряемого напряжения (A0)
  47. //
  48. //===========входные выводы============
  49. #define pin_PC_STATE(pin) (~(PINC >> (pin - 14)) & 1) // Запрос состояния вывода со сдвигом и инверсией результата
  50. #define pin_PC_InPullUp(pin) DDRC &=~(1 << (pin - 14)); PORTC |=(1 << (pin - 14)) // Инициализация входа с подтяжкой к VCC
  51. //
  52. #define pin_RAZGON_OFF 17 // Пин входа отключения разгона (A3 - это D17/PC3, при изменении подредактировать следующие два макроса)
  53. #define pin_RAZGON_OFF_INIT pin_PC_InPullUp(pin_RAZGON_OFF) // Определяем вывод отключения разгона, как вход и подтягиваем его внутренним резюком к VCC
  54. #define pin_RAZGON_OFF_STATE pin_PC_STATE(pin_RAZGON_OFF) // Читаем состояние пина и переводим в булев формат с учетом инверсии (активный - низкий)
  55. //
  56. #define pin_STAB_OFF 16 // Пин входа отключения стабилизатора (A2 - это D16/PC2, при изменении подредактировать следующие два макроса)
  57. #define pin_STAB_OFF_INIT pin_PC_InPullUp(pin_STAB_OFF) // Определяем вывод останова стаба, как вход и подтягиваем его внутренним резюком к VCC
  58. #define pin_STAB_OFF_STATE pin_PC_STATE(pin_STAB_OFF) // Читаем состояние пина и переводим в булев формат с учетом инверсии (активный - низкий)
  59. //
  60. //===========вЫходные выводы===========
  61. #define pin_PD_Out(pin) DDRD |=(1 << pin) // Инициализация выхода
  62. #define pin_PD_HIGH(pin) PORTD |=(1 << pin) // Установка выхода
  63. #define pin_PD_LOW(pin) PORTD &=~(1 << pin) // Сброс выхода
  64. #define pin_PD_INV(pin) PORTD ^=(1 << pin) // Инверсия выхода
  65. //
  66. //#define pin_OLEDres 2 // Пин сброса OLED индикатора.
  67. //#define pin_OLEDres_INIT pin_PD_Out(pin_OLEDres)
  68. //#define pin_OLEDres_HIGH pin_PD_HIGH(pin_OLEDres)
  69. //#define pin_OLEDres_LOW pin_PD_LOW(pin_OLEDres)
  70. //
  71. #define pin_TOut 6 // Пин выхода управления ТЭНом (на твердотельное реле)
  72. #define pin_TOut_INIT pin_PD_Out(pin_TOut)
  73. #define pin_TOut_HIGH pin_PD_HIGH(pin_TOut)
  74. #define pin_TOut_LOW pin_PD_LOW(pin_TOut)
  75. //
  76. #define pin_TRelay 7 // Пин выхода управления ТЭНом (на контактное реле в режиме максимальной мощности)
  77. #define pin_TRelay_INIT pin_PD_Out(pin_TRelay)
  78. #define pin_TRelay_HIGH pin_PD_HIGH(pin_TRelay)
  79. #define pin_TRelay_LOW pin_PD_LOW(pin_TRelay)
  80. //
  81. //===========тестовые выводы===========
  82. //#define pin_ZeroOut 5 // Пин выхода импульса ноля (D5 - PD5)
  83. //#define pin_ZeroOut_INIT pin_PD_Out(pin_ZeroOut)
  84. //#define pin_ZeroOut_INV pin_PD_INV(pin_ZeroOut)
  85. //#define pin_ZeroOut_HIGH pin_PD_HIGH(pin_ZeroOut)
  86. //#define pin_ZeroOut_LOW pin_PD_LOW(pin_ZeroOut)
  87. //
  88. //#define pin_DebugOut 7 // Пин для отладки (D7 - PD7)
  89. //#define pin_DebugOut_INIT pin_PD_Out(pin_DebugOut)
  90. //#define pin_DebugOut_INV pin_PD_INV(pin_DebugOut)
  91. //#define pin_DebugOut_HIGH pin_PD_HIGH(pin_DebugOut)
  92. //#define pin_DebugOut_LOW pin_PD_LOW(pin_DebugOut)
  93. //
  94. //#define pin_TestOut 3 // Пин для отладки (D3 - PD3)
  95. //#define pin_TestOut_INIT pin_PD_Out(pin_TestOut)
  96. //#define pin_TestOut_INV pin_PD_INV(pin_TestOut)
  97. //#define pin_TestOut_HIGH pin_PD_HIGH(pin_TestOut)
  98. //#define pin_TestOut_LOW pin_PD_LOW(pin_TestOut)
  99. //
  100. //===========выводы подключения кнопок===========
  101. #define pin_PB_STATE(pin) (~(PINB >> (pin - 8)) & 1) // Запрос состояния вывода со сдвигом и инверсией результата
  102. #define pin_PB_InPullUp(pin) DDRB &=~(1 << (pin - 8)); PORTB |=(1 << (pin - 8)) // Инициализация входа с подтяжкой к VCC
  103. #define pin_PB_OutLOW(pin) DDRB |=(1 << (pin - 8)); PORTB &=~(1 << (pin - 8)) // Инициализация выхода и сброс его
  104. //
  105. #define pin_butt_1 3 // Пин кнопки "Р-". Уменьшение уставки мощности. (D10 - PB2)
  106. #define pin_butt_1_INIT pin_PB_InPullUp(pin_butt_1) // Определяем вывод кнопки, как вход и подтягиваем его внутренним резюком к VCC
  107. #define pin_butt_1_STATE pin_PB_STATE(pin_butt_1) // Читаем состояние пина и переводим в булев формат с учетом инверсии (активный - низкий)
  108. //
  109. #define pin_butt_2 2 // Пин кнопки "Р+". Увеличение уставки мощности. (D9 - PB1)
  110. #define pin_butt_2_INIT pin_PB_InPullUp(pin_butt_2) // Определяем вывод кнопки, как вход и подтягиваем его внутренним резюком к VCC
  111. #define pin_butt_2_STATE pin_PB_STATE(pin_butt_2) // Читаем состояние пина и переводим в булев формат с учетом инверсии (активный - низкий)
  112. //
  113. #define pin_butt_3 5 // Пин кнопки "Стоп". Экстренное отключение ТЭНа. (D12 - PB4)
  114. #define pin_butt_3_INIT pin_PB_InPullUp(pin_butt_3) // Определяем вывод кнопки, как вход и подтягиваем его внутренним резюком к VCC
  115. #define pin_butt_3_STATE pin_PB_STATE(pin_butt_3) // Читаем состояние пина и переводим в булев формат с учетом инверсии (активный - низкий)
  116. //
  117. #define pin_butt_4 4 // Пин кнопки "Разгон". Включение/отключение разгона. (D11 - PB3)
  118. #define pin_butt_4_INIT pin_PB_InPullUp(pin_butt_4) // Определяем вывод кнопки, как вход и подтягиваем его внутренним резюком к VCC
  119. #define pin_butt_4_STATE pin_PB_STATE(pin_butt_4) // Читаем состояние пина и переводим в булев формат с учетом инверсии (активный - низкий)
  120. //
  121. //#define pin_buttGND 8 // Пин временного общего провода для подключения кнопок. (D8 - PB0)
  122. //#define pin_buttGND_INIT pin_PB_OutLOW(pin_buttGND) // Определяем вывод, как вЫход и устанавливаем низкий уровень
  123. //
  124. //===============бортовой светодиод==============
  125. // ???
  126. #define pin_LED 13 // Бортовой светодиод подключен к выводу D13 (PB5)
  127. #define pin_LED_INIT pin_PB_OutLOW(pin_LED) // Определяем вывод, как вЫход и устанавливаем низкий уровень
  128. #define TURN_LED_ON PORTB |=(1 << (pin_LED - 8)) // Включаем светодиод
  129. #define TURN_LED_OFF PORTB &=~(1 << (pin_LED - 8))// Выключаем светодиод
  130. //
  131. //==============управление релюшками=============
  132. #ifdef High_level_triac // управление твердотельным реле высоким уровнем
  133. #define TURN_SSR_ON pin_TOut_HIGH // Включаем ТЭН
  134. #define TURN_SSR_OFF pin_TOut_LOW // Выключаем ТЭН
  135. #else // управление твердотельным реле низким уровнем
  136. #define TURN_SSR_ON pin_TOut_LOW // Включаем ТЭН
  137. #define TURN_SSR_OFF pin_TOut_HIGH // Выключаем ТЭН
  138. #endif
  139. //
  140. #ifdef High_level_relay // управление контактным реле высоким уровнем
  141. #define TURN_RELAY_ON pin_TRelay_HIGH // Включаем ТЭН
  142. #define TURN_RELAY_OFF pin_TRelay_LOW // Выключаем ТЭН
  143. #else // управление контактным реле низким уровнем
  144. #define TURN_RELAY_ON pin_TRelay_LOW // Выключаем ТЭН
  145. #define TURN_RELAY_OFF pin_TRelay_HIGH // Включаем ТЭН
  146. #endif
  147. //
  148. //========коэффициенты для ПИД-регулировки=======
  149. #define Kp 2 // Коэффициент пропорциональности для ПИД-подстройки ФЧ сети (степень двойки для регистрового сдвига)
  150. #define Ki 5 // Интегральный коэффициент для ПИД-подстройки ФЧ сети (степень двойки для регистрового сдвига)
  151. #define Kd 1 // Дифференциальный коэффициент для ПИД-подстройки ФЧ сети (степень двойки для регистрового сдвига)
  152. #define Km 6 // Коэффициент для целочисленной математики (степень двойки для регистрового сдвига)
  153. #define PHASE 8 // сдвиг фаз между детекцией ноля и прерыванием таймера (в тиках таймера)
  154. #define T_MAX 180 // ограничение максимальной длительности полупериода в тиках таймера
  155. #define T_MIN 100 // ограничение минимальной длительности полупериода в тиках таймера
  156. //
  157. //================прочие константы===============
  158. #define ZSUM_MAX 5000 // Количество отсчетов АЦП без детекции ноля (5000 отсчетов это порядка 1 сек)
  159. #define U_ZERO 512 // Значение нуля АЦП для двуполярного сигнала с постоянной составляющей на выходе ОУ
  160. #define T_ADC 49 // Определяет интервал между запусками АЦП (200 мкс) f_OCn = f_clk / 2*N*(1 + X), где N - коэффициент деления предделителя, X- содержимое регистра OCRnA
  161. #define CICLE 500 // Количество полупериодов в полном цикле регулирования (200 полупериодов - 2сек, 500 полупериодов - 5сек, больше ставить не надо)
  162. //
  163. #define ASOled LD // Заюзаем уже созданный в библиотеке дисплея объект LD
  164. //
  165. #define EMPTY_CELL_VALUE 0xFFFF // Содержимое пустой ячейки памяти EEPROM
  166. #define SRVDATA_ARR_SIZE 14 // Размер блока памяти для вспомогательных данных
  167. #define Pnom_ARR_SIZE 8 // Макс. размер массива записанных номинальных мощностей ТЭНа sizeof(Pnom_arr)/sizeof(Pnom_arr[0])
  168. #define PDMset_ARR_SIZE 6 // Размер массива уставок мощности ТЭНа sizeof(PDMset)/sizeof(PDMset[0]) (ставить не меньше 4)
  169. #if Pnom_ARR_SIZE > PDMset_ARR_SIZE
  170. #define ARRAY_SIZE Pnom_ARR_SIZE // Размер массива для работы с номиналами в начальном меню и уставками
  171. #else
  172. #define ARRAY_SIZE PDMset_ARR_SIZE // Размер массива для работы с номиналами в начальном меню и уставками
  173. #endif
  174. //
  175. #ifdef __AVR_ATmega168__ // Выключение UARTа, чтобы влезало в 168атмегу
  176. #undef USE_USART
  177. #undef USE_RMVK
  178. #undef USE_ADprotocol
  179. #else
  180. #ifdef USE_USART
  181. static uint8_t cnt_uartWDT; // Счетчик секунд для организации отсчета ожидания окончания посылки по USART
  182. #endif
  183. #endif
  184. //
  185. #endif // __STAB_H__