Commit 6052a05c authored by Oleg Nikulin's avatar Oleg Nikulin

Ограничение скважности передается при инициализации

parent bd0e1274
...@@ -13,16 +13,22 @@ ...@@ -13,16 +13,22 @@
{ {
"targetTemperature": 35, "targetTemperature": 35,
"overheatTemperature": 60, "overheatTemperature": 60,
"minDutyCycle": 0.15,
"maxDutyCycle": 1,
"copyFromGroupIndex": 255 "copyFromGroupIndex": 255
}, },
{ {
"targetTemperature": 40, "targetTemperature": 40,
"overheatTemperature": 60, "overheatTemperature": 60,
"minDutyCycle": 0.15,
"maxDutyCycle": 1,
"copyFromGroupIndex": 255 "copyFromGroupIndex": 255
}, },
{ {
"targetTemperature": 45, "targetTemperature": 45,
"overheatTemperature": 60, "overheatTemperature": 60,
"minDutyCycle": 0.15,
"maxDutyCycle": 1,
"copyFromGroupIndex": 255 "copyFromGroupIndex": 255
} }
......
...@@ -74,4 +74,15 @@ def cmdline_args_parse(): ...@@ -74,4 +74,15 @@ def cmdline_args_parse():
) )
args = parser.parse_args() args = parser.parse_args()
return args return args
\ No newline at end of file
def convertDutyCycleToArduino(dutyCycle):
maxDutyCycle = 255
if (dutyCycle < 0):
dutyCycle = 0
elif (dutyCycle > 1):
dutyCycle = 1
return int(round(maxDutyCycle * dutyCycle))
...@@ -73,7 +73,15 @@ def initialize(serial_port): ...@@ -73,7 +73,15 @@ def initialize(serial_port):
config['controlGroups'][0]['copyFromGroupIndex'], config['controlGroups'][0]['copyFromGroupIndex'],
config['controlGroups'][1]['copyFromGroupIndex'], config['controlGroups'][1]['copyFromGroupIndex'],
config['controlGroups'][2]['copyFromGroupIndex'] config['controlGroups'][2]['copyFromGroupIndex'],
convertDutyCycleToArduino(config['controlGroups'][0]['minDutyCycle']),
convertDutyCycleToArduino(config['controlGroups'][1]['minDutyCycle']),
convertDutyCycleToArduino(config['controlGroups'][2]['minDutyCycle']),
convertDutyCycleToArduino(config['controlGroups'][0]['maxDutyCycle']),
convertDutyCycleToArduino(config['controlGroups'][1]['maxDutyCycle']),
convertDutyCycleToArduino(config['controlGroups'][2]['maxDutyCycle'])
] ]
response_length = 3 response_length = 3
......
...@@ -8,11 +8,8 @@ ...@@ -8,11 +8,8 @@
#define RPM_CHECK_INTERVAL 200 //Интервал подсчета rpm и обнуления tachRevs (мс) #define RPM_CHECK_INTERVAL 200 //Интервал подсчета rpm и обнуления tachRevs (мс)
#define RPM_VALUES_COUNT 5 //Количество значений RPM, которые записываются и усредняются (скользящее среднее) #define RPM_VALUES_COUNT 5 //Количество значений RPM, которые записываются и усредняются (скользящее среднее)
#define MIN_PWM_DUTY_CYCLE 64 //Минимальная скважность ШИМ #define MIN_PWM_DUTY_CYCLE 2 //Минимальная скважность ШИМ
#define MAX_PWM_DUTY_CYCLE 254 //Максимальная скважность ШИМ #define MAX_PWM_DUTY_CYCLE 254 //Максимальная скважность ШИМ
//если true, вентилятор не будет полностью включаться/выключаться. Всегда будет какой-то шим
#define CONSTRAIN_MIN true
#define CONSTRAIN_MAX false
#define OFF_DUTY_CYCLE 0 //Условная скважность, при которой на самом деле вентиялтор выключен #define OFF_DUTY_CYCLE 0 //Условная скважность, при которой на самом деле вентиялтор выключен
#define ON_DUTY_CYCLE 255 //Условная скважность, при которой на самом деле вентиялтор постоянно включен #define ON_DUTY_CYCLE 255 //Условная скважность, при которой на самом деле вентиялтор постоянно включен
#define DEFAULT_PWM_DUTY_CYCLE ON_DUTY_CYCLE //Скважность ШИМ по умолчанию (до подключения к пк) #define DEFAULT_PWM_DUTY_CYCLE ON_DUTY_CYCLE //Скважность ШИМ по умолчанию (до подключения к пк)
...@@ -44,6 +41,8 @@ struct control {//Данные о группе управления ...@@ -44,6 +41,8 @@ struct control {//Данные о группе управления
temp_t overheat_temperature; //Температура >= этой считается перегревом temp_t overheat_temperature; //Температура >= этой считается перегревом
temp_t target_temperature; //Температура, к которой нужно стремиться temp_t target_temperature; //Температура, к которой нужно стремиться
int8_t copy_from; //Копировать скважность с другой группы управления. -1 = не копировать, 0 = с группы A, 1 = с группы B, 2 = с группы C int8_t copy_from; //Копировать скважность с другой группы управления. -1 = не копировать, 0 = с группы A, 1 = с группы B, 2 = с группы C
uint8_t min_duty_cycle;
uint8_t max_duty_cycle;
}; };
control controls[CONTROL_COUNT] = { control controls[CONTROL_COUNT] = {
...@@ -54,7 +53,9 @@ control controls[CONTROL_COUNT] = { ...@@ -54,7 +53,9 @@ control controls[CONTROL_COUNT] = {
0, 0,
60, 60,
0, 0,
-1 -1,
OFF_DUTY_CYCLE,
ON_DUTY_CYCLE
}, },
{ {
5, 5,
...@@ -63,7 +64,9 @@ control controls[CONTROL_COUNT] = { ...@@ -63,7 +64,9 @@ control controls[CONTROL_COUNT] = {
0, 0,
60, 60,
0, 0,
0 0,
OFF_DUTY_CYCLE,
ON_DUTY_CYCLE
}, },
{ {
6, 6,
...@@ -72,7 +75,9 @@ control controls[CONTROL_COUNT] = { ...@@ -72,7 +75,9 @@ control controls[CONTROL_COUNT] = {
0, 0,
60, 60,
0, 0,
0 0,
OFF_DUTY_CYCLE,
ON_DUTY_CYCLE
} }
}; };
...@@ -211,7 +216,7 @@ void process_command() { ...@@ -211,7 +216,7 @@ void process_command() {
//по коду команды понимаем длину команды (с учетом байта кода команды и двух байт crc) //по коду команды понимаем длину команды (с учетом байта кода команды и двух байт crc)
switch(cmd_code) { switch(cmd_code) {
case pc_command_codes::initialize: case pc_command_codes::initialize:
cmd_length = 13; cmd_length = 19;
break; break;
case pc_command_codes::poll: case pc_command_codes::poll:
cmd_length = 9; cmd_length = 9;
...@@ -247,6 +252,14 @@ void process_command() { ...@@ -247,6 +252,14 @@ void process_command() {
control_b.copy_from = cmd_buffer[9]; control_b.copy_from = cmd_buffer[9];
control_c.copy_from = cmd_buffer[10]; control_c.copy_from = cmd_buffer[10];
control_a.min_duty_cycle = cmd_buffer[11];
control_b.min_duty_cycle = cmd_buffer[12];
control_c.min_duty_cycle = cmd_buffer[13];
control_a.max_duty_cycle = cmd_buffer[14];
control_b.max_duty_cycle = cmd_buffer[15];
control_c.max_duty_cycle = cmd_buffer[16];
initialized = true; initialized = true;
response_buffer[0] = arduino_response_codes::initialize_ok; response_buffer[0] = arduino_response_codes::initialize_ok;
...@@ -343,38 +356,26 @@ void rpm_control() { ...@@ -343,38 +356,26 @@ void rpm_control() {
void set_duty_cycle(control &fanControl, int duty_cycle) { void set_duty_cycle(control &fanControl, int duty_cycle) {
if (duty_cycle < fanControl.min_duty_cycle)
duty_cycle = fanControl.min_duty_cycle;
else if (duty_cycle > fanControl.max_duty_cycle)
duty_cycle = fanControl.max_duty_cycle;
if (duty_cycle < MIN_PWM_DUTY_CYCLE) { if (duty_cycle < MIN_PWM_DUTY_CYCLE) {
if (CONSTRAIN_MIN) fanControl.mode = control_pwm_mode::off;
{ digitalWrite(fanControl.pin, 0);
fanControl.mode = control_pwm_mode::pwm; fanControl.dutyCycle = OFF_DUTY_CYCLE;
fanControl.dutyCycle = MIN_PWM_DUTY_CYCLE;
}
else
{
fanControl.mode = control_pwm_mode::off;
digitalWrite(fanControl.pin, 0);
fanControl.dutyCycle = OFF_DUTY_CYCLE;
}
} }
else if (duty_cycle > MAX_PWM_DUTY_CYCLE) { else if (duty_cycle > MAX_PWM_DUTY_CYCLE) {
if (CONSTRAIN_MAX) fanControl.mode = control_pwm_mode::on;
{ digitalWrite(fanControl.pin, 1);
fanControl.mode = control_pwm_mode::pwm; fanControl.dutyCycle = ON_DUTY_CYCLE;
fanControl.dutyCycle = MAX_PWM_DUTY_CYCLE;
}
else
{
fanControl.mode = control_pwm_mode::on; //всегда вкл
digitalWrite(fanControl.pin, 1);
fanControl.dutyCycle = ON_DUTY_CYCLE;
}
} }
else { else {
fanControl.mode = control_pwm_mode::pwm; fanControl.mode = control_pwm_mode::pwm;
fanControl.dutyCycle = duty_cycle; fanControl.dutyCycle = duty_cycle;
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment