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

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

parent bd0e1274
......@@ -13,16 +13,22 @@
{
"targetTemperature": 35,
"overheatTemperature": 60,
"minDutyCycle": 0.15,
"maxDutyCycle": 1,
"copyFromGroupIndex": 255
},
{
"targetTemperature": 40,
"overheatTemperature": 60,
"minDutyCycle": 0.15,
"maxDutyCycle": 1,
"copyFromGroupIndex": 255
},
{
"targetTemperature": 45,
"overheatTemperature": 60,
"minDutyCycle": 0.15,
"maxDutyCycle": 1,
"copyFromGroupIndex": 255
}
......
......@@ -75,3 +75,14 @@ def cmdline_args_parse():
args = parser.parse_args()
return args
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):
config['controlGroups'][0]['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
......
......@@ -8,11 +8,8 @@
#define RPM_CHECK_INTERVAL 200 //Интервал подсчета rpm и обнуления tachRevs (мс)
#define RPM_VALUES_COUNT 5 //Количество значений RPM, которые записываются и усредняются (скользящее среднее)
#define MIN_PWM_DUTY_CYCLE 64 //Минимальная скважность ШИМ
#define MIN_PWM_DUTY_CYCLE 2 //Минимальная скважность ШИМ
#define MAX_PWM_DUTY_CYCLE 254 //Максимальная скважность ШИМ
//если true, вентилятор не будет полностью включаться/выключаться. Всегда будет какой-то шим
#define CONSTRAIN_MIN true
#define CONSTRAIN_MAX false
#define OFF_DUTY_CYCLE 0 //Условная скважность, при которой на самом деле вентиялтор выключен
#define ON_DUTY_CYCLE 255 //Условная скважность, при которой на самом деле вентиялтор постоянно включен
#define DEFAULT_PWM_DUTY_CYCLE ON_DUTY_CYCLE //Скважность ШИМ по умолчанию (до подключения к пк)
......@@ -44,6 +41,8 @@ struct control {//Данные о группе управления
temp_t overheat_temperature; //Температура >= этой считается перегревом
temp_t target_temperature; //Температура, к которой нужно стремиться
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] = {
......@@ -54,7 +53,9 @@ control controls[CONTROL_COUNT] = {
0,
60,
0,
-1
-1,
OFF_DUTY_CYCLE,
ON_DUTY_CYCLE
},
{
5,
......@@ -63,7 +64,9 @@ control controls[CONTROL_COUNT] = {
0,
60,
0,
0
0,
OFF_DUTY_CYCLE,
ON_DUTY_CYCLE
},
{
6,
......@@ -72,7 +75,9 @@ control controls[CONTROL_COUNT] = {
0,
60,
0,
0
0,
OFF_DUTY_CYCLE,
ON_DUTY_CYCLE
}
};
......@@ -211,7 +216,7 @@ void process_command() {
//по коду команды понимаем длину команды (с учетом байта кода команды и двух байт crc)
switch(cmd_code) {
case pc_command_codes::initialize:
cmd_length = 13;
cmd_length = 19;
break;
case pc_command_codes::poll:
cmd_length = 9;
......@@ -247,6 +252,14 @@ void process_command() {
control_b.copy_from = cmd_buffer[9];
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;
response_buffer[0] = arduino_response_codes::initialize_ok;
......@@ -343,38 +356,26 @@ void rpm_control() {
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 (CONSTRAIN_MIN)
{
fanControl.mode = control_pwm_mode::pwm;
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) {
if (CONSTRAIN_MAX)
{
fanControl.mode = control_pwm_mode::pwm;
fanControl.dutyCycle = MAX_PWM_DUTY_CYCLE;
}
else
{
fanControl.mode = control_pwm_mode::on; //всегда вкл
fanControl.mode = control_pwm_mode::on;
digitalWrite(fanControl.pin, 1);
fanControl.dutyCycle = ON_DUTY_CYCLE;
}
}
else {
fanControl.mode = control_pwm_mode::pwm;
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