-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfan.cpp
140 lines (120 loc) · 4.16 KB
/
fan.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
//----------------------------------------------------------------------------
//Ìîäóëü óïðàâëåíèÿ âåíòèëÿòîðîì
//----------------------- Èñïîëüçóåìûå ðåñóðñû: ------------------------------
//Âåíòèëÿòîð ÷åðåç êëþ÷åâîé êàñêàä (òðàíçèñòîð, äèîä, äðîññåëü, êîíäåíñàòîð)
//ïîäêëþ÷åí ê ïîðòó PB14 (âûõîä òàéìåðà TIM15 CH1). Àêòèâíûé óðîâåíü - ÂÛÑÎÊÈÉ.
//×àñòîòà ØÈÌ óñòàíàâëèâàåòñÿ ìàêñèìàëüíî âîçìîæíîé, ÷òîáû â êàê ìîæíî áîëüøåì
//äèàïàçîíå ðåãóëèðîâêè îáåñïå÷èòü íåðàçðûâíûé òîê äðîññåëÿ.
//Äëÿ óïðàâëåíèÿ èñïîëüçóþòñÿ ãðàäàöèè ØÈÌ îò 0 äî 100, ÷òî ñîîòâåòñòâóåò
//ñêîðîñòè âðàùåíèÿ îò 0 äî 100%. Êëþ÷åâîé êàñêàä ïèòàåòñÿ îò íàïðÿæåíèÿ V2,
//êîòîðîå îáû÷íî âûøå íîìèíàëüíîãî íàïðÿæåíèÿ äâèãàòåëÿ âåíòèëÿòîðà. Ïîýòîìó
//îáùåå ÷èñëî ãðàäàöèé ØÈÌ âûáèðàåòñÿ òàêèì îáðàçîì, ÷òîáû 100-ÿ ãðàäàöèÿ
//ñîîòâåòñòâîâàëà íîìèíàëüíîìó íàïðÿæåíèþ âåíòèëÿòîðà FAN_V_MAX.
//----------------------------------------------------------------------------
#include "main.h"
#include "fan.h"
#include "data.h"
#include "therm.h"
//------------------------------- Êîíñòàíòû: ---------------------------------
#define V2 22.5 //óðîâåíü íàïðÿæåíèÿ V2, Â
#define FAN_MAX_V 12.0 //ìàêñèìàëüíîå íàïðÿæåíèå ïèòàíèÿ âåíòèëÿòîðà, Â
#define FAN_MAX_PWM ((uint16_t)(FAN_MAX_SPEED * V2 / FAN_MAX_V))
enum { FAN_OFF, FAN_RUN }; //ñîñòîÿíèÿ âåíòèëÿòîðà
//----------------------------------------------------------------------------
//------------------------------ Êëàññ TFan: ---------------------------------
//----------------------------------------------------------------------------
//----------------------------- Êîíñòðóêòîð: ---------------------------------
TFan::TFan(void)
{
RCC->APB2ENR |= RCC_APB2ENR_TIM15EN; //âêëþ÷åíèå òàêòèðîâàíèÿ TIM15
TIM15->PSC = 0; //ïðåñêàëåð
TIM15->ARR = FAN_MAX_PWM; //ïåðèîä
TIM15->CCR1 = 0; //êîä PWM
TIM15->CCMR1 =
TIM_CCMR1_OC1M_0 * 6 | //PWM mode 1
TIM_CCMR1_OC1PE * 1; //CCR1 preload enable
TIM15->CCER =
TIM_CCER_CC1P * 0 | //high active
TIM_CCER_CC1E * 1; //OC1 enable
TIM15->EGR = TIM_EGR_UG; //update regs from shadow regs
TIM15->BDTR = TIM_BDTR_MOE; //main output enable
TIM15->CR1 = TIM_CR1_CEN; //ðàçðåøåíèå òàéìåðà
AFIO->MAPR2 |= AFIO_MAPR2_TIM15_REMAP; //remap TIM15
Pin_FAN.Init(AF_PP_10M); //íàñòðîéêà ïèíà
RunTimer = 0;
SetSpeed(0);
State = FAN_OFF;
}
//------------------------ Óïðàâëåíèå âåíòèëÿòîðîì: --------------------------
void TFan::Control(int16_t tl, int16_t th, int16_t tget)
{
//ïðîâåðêà àâàðèéíûõ ñèòóàöèé:
if(th == TEMP_FAIL || tget == TEMP_FAIL)
{
Speed = FAN_MAX_SPEED;
}
//ïðîïîðöèîíàëüíîå óïðàâëåíèå:
else if(tl < th)
{
if(tget > th) Speed = FAN_MAX_SPEED;
else if(tget < tl) Speed = 0;
else Speed = FAN_MIN_SPEED + (int32_t)(tget - tl) * (FAN_MAX_SPEED - FAN_MIN_SPEED) / (th - tl);
}
//ðåëåéíîå óïðàâëåíèå ñ ãèñòåðåçèñîì:
else
{
if(tget > tl) Speed = FAN_MAX_SPEED;
else if(tget < th) Speed = 0;
}
switch(State)
{
case FAN_OFF:
{
if(Speed > FAN_MIN_SPEED)
{
Speed = FAN_STARTUP_SPEED;
State = FAN_RUN;
RunTimer = FAN_MIN_RUN;
}
else
{
Speed = 0;
}
break;
}
case FAN_RUN:
{
if(RunTimer)
{
RunTimer--;
if(Speed < FAN_MIN_SPEED)
Speed = FAN_MIN_SPEED;
}
else
{
if(Speed < FAN_MIN_SPEED)
{
Speed = 0;
State = FAN_OFF;
}
}
break;
}
}
SetSpeed(Speed);
}
//-------------------- Óñòàíîâêà ñêîðîñòè âåíòèëÿòîðà: -----------------------
void TFan::SetSpeed(uint8_t p)
{
if(p > FAN_MAX_SPEED) p = FAN_MAX_SPEED;
Speed = p;
TIM15->CCR1 = p;
}
//--------------------- ×òåíèå ñêîðîñòè âåíòèëÿòîðà: -------------------------
uint8_t TFan::GetSpeed(void)
{
return(Speed);
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------