Commit a18376e6 authored by Oleg Nikulin's avatar Oleg Nikulin

Небольшие доработки

parent c0d51e9b
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
#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 8 //Минимальная скважность ШИМ #define MIN_PWM_DUTY_CYCLE 2 //Минимальная скважность ШИМ
#define MAX_PWM_DUTY_CYCLE 254 //Максимальная скважность ШИМ #define MAX_PWM_DUTY_CYCLE 254 //Максимальная скважность ШИМ
#define DEFAULT_PWM_DUTY_CYCLE 254 //Скважность ШИМ по умолчанию (до подулючения к пк) #define DEFAULT_PWM_DUTY_CYCLE 254 //Скважность ШИМ по умолчанию (до подулючения к пк)
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
#define SOUND_PIN 10 //Номер пина пищалки #define SOUND_PIN 10 //Номер пина пищалки
#define LED_PIN 13 //Номер пина светодиода #define LED_PIN 13 //Номер пина светодиода
#define OVERHEAT_TEMP 80 //Температура, при достижении которой включается пищалка #define OVERHEAT_TEMP 75 //Температура, при достижении которой включается пищалка
uint8_t *control_a_addr = 0x88; //адрес сравнения А таймера 1 uint8_t *control_a_addr = 0x88; //адрес сравнения А таймера 1
uint8_t *control_b_addr = 0xB3; //адрес сравнения А таймера 2 uint8_t *control_b_addr = 0xB3; //адрес сравнения А таймера 2
...@@ -29,7 +29,7 @@ struct control {//Данные о группе управления ...@@ -29,7 +29,7 @@ struct control {//Данные о группе управления
uint8_t pin; //Номер пина uint8_t pin; //Номер пина
volatile uint8_t mode; //Текущий режим работы. 0 - всегда выкл, 1 - шим, 2 - всегда вкл volatile uint8_t mode; //Текущий режим работы. 0 - всегда выкл, 1 - шим, 2 - всегда вкл
uint8_t &dutyCycle; //Скважность ШИМ uint8_t &dutyCycle; //Скважность ШИМ
int8_t copy_from; //Копировать скважность из другой группы управления. -1 = не копировать int8_t copy_from; //Копировать скважность с другой группы управления. -1 = не копировать, 0 = с группы A, 1 = с группы B, 2 = с группы C
}; };
control controls[CONTROL_COUNT] = { control controls[CONTROL_COUNT] = {
...@@ -136,7 +136,7 @@ float k_d = 0; ...@@ -136,7 +136,7 @@ float k_d = 0;
float i_max = 210; float i_max = 210;
int target_temps[3] = {27, 0, 0}; int target_temps[3] = {27, 0, 0}; //Температуры, к которым нужно стремиться
void wait_for_connection(bool beep) { //функция, которая мигает светодиодом и пищит (если beep == true) до тех пор, пока не будет установлено соединение с ПК void wait_for_connection(bool beep) { //функция, которая мигает светодиодом и пищит (если beep == true) до тех пор, пока не будет установлено соединение с ПК
Serial.println("start_transmission"); Serial.println("start_transmission");
...@@ -189,7 +189,7 @@ void tempFromPc()// получаем температуру от пк ...@@ -189,7 +189,7 @@ void tempFromPc()// получаем температуру от пк
} }
} }
Serial.println("req_temperature_" + rpm_string + "_debug(pwm values):_" + String(OCR1A) + "_" + String(OCR2A) + "_" + String(OCR2B)); //запрос к пк Serial.println("req_temperature_" + rpm_string + "_debug_" + String(OCR1A) + "_" + String(OCR2A) + "_" + String(OCR2B)); //запрос к пк
unsigned long query_time = millis(); unsigned long query_time = millis();
while (Serial.available() == 0) { //ждем пока ответит while (Serial.available() == 0) { //ждем пока ответит
if (millis() >= query_time + GET_TEMP_TIMEOUT) { //если слишком долго не отвечает if (millis() >= query_time + GET_TEMP_TIMEOUT) { //если слишком долго не отвечает
...@@ -287,39 +287,44 @@ void rpm_control() { ...@@ -287,39 +287,44 @@ void rpm_control() {
duty_cycle = pwmDutyCycle; duty_cycle = pwmDutyCycle;
} }
set_duty_cycle(controls[group], duty_cycle);
if (duty_cycle < MIN_PWM_DUTY_CYCLE) {
controls[group].mode = 0; //всегда выкл
digitalWrite(controls[group].pin, 0);
}
else if (duty_cycle > MAX_PWM_DUTY_CYCLE) {
controls[group].mode = 2; //всегда вкл
digitalWrite(controls[group].pin, 1);
}
else {
controls[group].mode = 1; //шим
}
controls[group].dutyCycle = duty_cycle;
} }
else { else {
controls[group].mode = controls[controls[group].copy_from].mode; controls[group].mode = controls[controls[group].copy_from].mode;
controls[group].dutyCycle = controls[controls[group].copy_from].dutyCycle; controls[group].dutyCycle = controls[controls[group].copy_from].dutyCycle;
} }
}
}
lastRpmCheck = millis(); lastRpmCheck = millis();
} }
void set_duty_cycle(control &fanControl, uint16_t duty_cycle) {
if (duty_cycle < MIN_PWM_DUTY_CYCLE) {
fanControl.mode = 0; //всегда выкл
digitalWrite(fanControl.pin, 0);
fanControl.dutyCycle = 0;
}
else if (duty_cycle > MAX_PWM_DUTY_CYCLE) {
fanControl.mode = 2; //всегда вкл
digitalWrite(fanControl.pin, 1);
fanControl.dutyCycle = 255;
}
else {
fanControl.mode = 1; //шим
fanControl.dutyCycle = duty_cycle;
}
}
ISR(TIMER1_COMPA_vect) { //Функция, вызываемая при прерывании 1A ISR(TIMER1_COMPA_vect) { //Функция, вызываемая при прерывании 1A
if (control_a.mode < 2) { //если не всегда вкл if (control_a.mode < 2) { //если не всегда вкл
PORTD &= 0b1110111; //выкл питание на пине 3 PORTD &= 0b11110111; //выкл питание на пине 3
} }
} }
...@@ -340,16 +345,14 @@ ISR(TIMER2_COMPB_vect) { //Функция, вызываемая при прер ...@@ -340,16 +345,14 @@ ISR(TIMER2_COMPB_vect) { //Функция, вызываемая при прер
ISR(TIMER1_OVF_vect) { //Функция, вызываемая при переполнении таймера 1 ISR(TIMER1_OVF_vect) { //Функция, вызываемая при переполнении таймера 1
if (control_a.mode > 0) { //если режим шим или всегда вкл if (control_a.mode > 0) { //если режим шим или всегда вкл
digitalWrite(control_a.pin, 1); PORTD |= 0b00001000; //вкл питание на пине 3
} }
//delayMicroseconds(15);
for (int i = 0; i < 2; i++) { //проверка тахометров 0-1 for (int i = 0; i < 2; i++) { //проверка тахометров 0-1
if (digitalRead(fans[i].pin) == 0 && fans[i].state == 0) { //сигнал тахометра появился bool currentState = (PINC >> (fans[i].pin - 14)) & 0x01;
if (currentState == 0 && fans[i].state == 0) { //сигнал тахометра появился
fans[i].state = 1; fans[i].state = 1;
//digitalWrite(13, 1);
} }
else if (digitalRead(fans[i].pin) == 1 && fans[i].state == 1) { //сигнал тахометра пропал else if (currentState == 1 && fans[i].state == 1) { //сигнал тахометра пропал
//digitalWrite(13, 0);
fans[i].state = 0; fans[i].state = 0;
fans[i].revs++; //засчитывается оборот fans[i].revs++; //засчитывается оборот
} }
...@@ -365,32 +368,20 @@ ISR(TIMER2_OVF_vect) { //Функция, вызываемая при переп ...@@ -365,32 +368,20 @@ ISR(TIMER2_OVF_vect) { //Функция, вызываемая при переп
if (control_c.mode > 0) { //если режим шим или всегда вкл if (control_c.mode > 0) { //если режим шим или всегда вкл
PORTD |= 0b01000000; //вкл питание на пине 6 PORTD |= 0b01000000; //вкл питание на пине 6
} }
//delayMicroseconds(10);
for (int i = 2; i < 6; i++) { //проверка тахометров 2-5 for (int i = 2; i < 6; i++) { //проверка тахометров 2-5
if (digitalRead(fans[i].pin) == 0 && fans[i].state == 0) { //сигнал тахометра появился bool currentState = (PINC >> (fans[i].pin - 14)) & 0x01;
if (currentState == 0 && fans[i].state == 0) { //сигнал тахометра появился
fans[i].state = 1; fans[i].state = 1;
//digitalWrite(13, 1);
} }
else if (digitalRead(fans[i].pin) == 1 && fans[i].state == 1) { //сигнал тахометра пропал else if (currentState == 1 && fans[i].state == 1) { //сигнал тахометра пропал
//digitalWrite(13, 0);
fans[i].state = 0; fans[i].state = 0;
fans[i].revs++; //засчитывается оборот fans[i].revs++; //засчитывается оборот
} }
} }
} }
bool getbitstate(int num, uint8_t bit_pos) {
bool bits_array[8];
for (int i = 0; i < 8; i++) {
bits_array[i] = num >> (8 - 1 - i) & 1;
}
return bits_array[bit_pos];
}
void setup() { void setup() {
pinMode(LED_PIN, OUTPUT); pinMode(LED_PIN, OUTPUT);
...@@ -408,8 +399,6 @@ void setup() { ...@@ -408,8 +399,6 @@ void setup() {
//таймер 2 сравнение A - пин 5 //таймер 2 сравнение A - пин 5
//таймер 2 сравнение B - пин 6 //таймер 2 сравнение B - пин 6
//Пины 5 и 6: скважность от 8 до 255.
//режим таймера 1 (fast pwm 8 бит): //режим таймера 1 (fast pwm 8 бит):
TCCR1B |= (1 << WGM12); TCCR1B |= (1 << WGM12);
TCCR1A |= (1 << WGM10); TCCR1A |= (1 << WGM10);
...@@ -425,8 +414,8 @@ void setup() { ...@@ -425,8 +414,8 @@ void setup() {
TIMSK2 |= (1 << OCIE2B); //вкл. вызов прерывания таймера 2 по сравнению B TIMSK2 |= (1 << OCIE2B); //вкл. вызов прерывания таймера 2 по сравнению B
TIMSK2 |= (1 << TOIE2); //вкл. вызов прерывания при переполнении таймера 2 TIMSK2 |= (1 << TOIE2); //вкл. вызов прерывания при переполнении таймера 2
for (int i = 0; i < CONTROL_COUNT; i++) { for (int i = 0; i < CONTROL_COUNT; i++) { //установка скважности по умолчанию
controls[i].dutyCycle = DEFAULT_PWM_DUTY_CYCLE; //установка скважности по умолчанию set_duty_cycle(controls[i], DEFAULT_PWM_DUTY_CYCLE);
} }
Serial.begin(BAUDRATE); Serial.begin(BAUDRATE);
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
#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 8 //Минимальная скважность ШИМ #define MIN_PWM_DUTY_CYCLE 2 //Минимальная скважность ШИМ
#define MAX_PWM_DUTY_CYCLE 254 //Максимальная скважность ШИМ #define MAX_PWM_DUTY_CYCLE 254 //Максимальная скважность ШИМ
#define DEFAULT_PWM_DUTY_CYCLE 254 //Скважность ШИМ по умолчанию (до подулючения к пк) #define DEFAULT_PWM_DUTY_CYCLE 254 //Скважность ШИМ по умолчанию (до подулючения к пк)
...@@ -247,35 +247,37 @@ void rpm_control() { ...@@ -247,35 +247,37 @@ void rpm_control() {
for (int group = 0; group < 3; group++) {//управление скоростью 3-х групп вентиляторов for (int group = 0; group < 3; group++) {//управление скоростью 3-х групп вентиляторов
uint8_t duty_cycle = temps[group]; set_duty_cycle(controls[group], temps[group]);
if (duty_cycle < MIN_PWM_DUTY_CYCLE) {
controls[group].mode = 0; //всегда выкл
digitalWrite(controls[group].pin, 0);
}
else if (duty_cycle > MAX_PWM_DUTY_CYCLE) {
controls[group].mode = 2; //всегда вкл
digitalWrite(controls[group].pin, 1);
}
else {
controls[group].mode = 1; //шим
}
controls[group].dutyCycle = duty_cycle;
} }
lastRpmCheck = millis(); lastRpmCheck = millis();
} }
void set_duty_cycle(control &fanControl, uint16_t duty_cycle) {
if (duty_cycle < MIN_PWM_DUTY_CYCLE) {
fanControl.mode = 0; //всегда выкл
digitalWrite(fanControl.pin, 0);
fanControl.dutyCycle = 0;
}
else if (duty_cycle > MAX_PWM_DUTY_CYCLE) {
fanControl.mode = 2; //всегда вкл
digitalWrite(fanControl.pin, 1);
fanControl.dutyCycle = 255;
}
else {
fanControl.mode = 1; //шим
fanControl.dutyCycle = duty_cycle;
}
}
ISR(TIMER1_COMPA_vect) { //Функция, вызываемая при прерывании 1A ISR(TIMER1_COMPA_vect) { //Функция, вызываемая при прерывании 1A
if (control_a.mode < 2) { //если не всегда вкл if (control_a.mode < 2) { //если не всегда вкл
PORTD &= 0b1110111; //выкл питание на пине 3 PORTD &= 0b11110111; //выкл питание на пине 3
} }
} }
...@@ -296,16 +298,14 @@ ISR(TIMER2_COMPB_vect) { //Функция, вызываемая при прер ...@@ -296,16 +298,14 @@ ISR(TIMER2_COMPB_vect) { //Функция, вызываемая при прер
ISR(TIMER1_OVF_vect) { //Функция, вызываемая при переполнении таймера 1 ISR(TIMER1_OVF_vect) { //Функция, вызываемая при переполнении таймера 1
if (control_a.mode > 0) { //если режим шим или всегда вкл if (control_a.mode > 0) { //если режим шим или всегда вкл
digitalWrite(control_a.pin, 1); PORTD |= 0b00001000; //вкл питание на пине 3
} }
//delayMicroseconds(15);
for (int i = 0; i < 2; i++) { //проверка тахометров 0-1 for (int i = 0; i < 2; i++) { //проверка тахометров 0-1
if (digitalRead(fans[i].pin) == 0 && fans[i].state == 0) { //сигнал тахометра появился bool currentState = (PINC >> (fans[i].pin - 14)) & 0x01;
if (currentState == 0 && fans[i].state == 0) { //сигнал тахометра появился
fans[i].state = 1; fans[i].state = 1;
//digitalWrite(13, 1);
} }
else if (digitalRead(fans[i].pin) == 1 && fans[i].state == 1) { //сигнал тахометра пропал else if (currentState == 1 && fans[i].state == 1) { //сигнал тахометра пропал
//digitalWrite(13, 0);
fans[i].state = 0; fans[i].state = 0;
fans[i].revs++; //засчитывается оборот fans[i].revs++; //засчитывается оборот
} }
...@@ -321,32 +321,20 @@ ISR(TIMER2_OVF_vect) { //Функция, вызываемая при переп ...@@ -321,32 +321,20 @@ ISR(TIMER2_OVF_vect) { //Функция, вызываемая при переп
if (control_c.mode > 0) { //если режим шим или всегда вкл if (control_c.mode > 0) { //если режим шим или всегда вкл
PORTD |= 0b01000000; //вкл питание на пине 6 PORTD |= 0b01000000; //вкл питание на пине 6
} }
//delayMicroseconds(10);
for (int i = 2; i < 6; i++) { //проверка тахометров 2-5 for (int i = 2; i < 6; i++) { //проверка тахометров 2-5
if (digitalRead(fans[i].pin) == 0 && fans[i].state == 0) { //сигнал тахометра появился bool currentState = (PINC >> (fans[i].pin - 14)) & 0x01;
if (currentState == 0 && fans[i].state == 0) { //сигнал тахометра появился
fans[i].state = 1; fans[i].state = 1;
//digitalWrite(13, 1);
} }
else if (digitalRead(fans[i].pin) == 1 && fans[i].state == 1) { //сигнал тахометра пропал else if (currentState == 1 && fans[i].state == 1) { //сигнал тахометра пропал
//digitalWrite(13, 0);
fans[i].state = 0; fans[i].state = 0;
fans[i].revs++; //засчитывается оборот fans[i].revs++; //засчитывается оборот
} }
} }
} }
bool getbitstate(int num, uint8_t bit_pos) {
bool bits_array[8];
for (int i = 0; i < 8; i++) {
bits_array[i] = num >> (8 - 1 - i) & 1;
}
return bits_array[bit_pos];
}
void setup() { void setup() {
pinMode(LED_PIN, OUTPUT); pinMode(LED_PIN, OUTPUT);
...@@ -364,8 +352,6 @@ void setup() { ...@@ -364,8 +352,6 @@ void setup() {
//таймер 2 сравнение A - пин 5 //таймер 2 сравнение A - пин 5
//таймер 2 сравнение B - пин 6 //таймер 2 сравнение B - пин 6
//Пины 5 и 6: скважность от 8 до 255.
//режим таймера 1 (fast pwm 8 бит): //режим таймера 1 (fast pwm 8 бит):
TCCR1B |= (1 << WGM12); TCCR1B |= (1 << WGM12);
TCCR1A |= (1 << WGM10); TCCR1A |= (1 << WGM10);
...@@ -381,8 +367,8 @@ void setup() { ...@@ -381,8 +367,8 @@ void setup() {
TIMSK2 |= (1 << OCIE2B); //вкл. вызов прерывания таймера 2 по сравнению B TIMSK2 |= (1 << OCIE2B); //вкл. вызов прерывания таймера 2 по сравнению B
TIMSK2 |= (1 << TOIE2); //вкл. вызов прерывания при переполнении таймера 2 TIMSK2 |= (1 << TOIE2); //вкл. вызов прерывания при переполнении таймера 2
for (int i = 0; i < CONTROL_COUNT; i++) { for (int i = 0; i < CONTROL_COUNT; i++) { //установка скважности по умолчанию
controls[i].dutyCycle = DEFAULT_PWM_DUTY_CYCLE; //установка скважности по умолчанию set_duty_cycle(controls[i], DEFAULT_PWM_DUTY_CYCLE);
} }
Serial.begin(BAUDRATE); Serial.begin(BAUDRATE);
...@@ -398,20 +384,6 @@ void loop() { ...@@ -398,20 +384,6 @@ void loop() {
if (uint32_t(millis() - last_check_time) >= CHECK_TEMP_DELAY) { if (uint32_t(millis() - last_check_time) >= CHECK_TEMP_DELAY) {
last_check_time = millis(); last_check_time = millis();
tempFromPc();//получаем температуру от пк tempFromPc();//получаем температуру от пк
// if (temp >= 80) { //Если перегрев, включается пищалка
// if (millis() >= last_beep_time + BEEP_INTERVAL * 2) {
// analogWrite(SOUND_PIN, BEEP_STRENGTH);
// last_beep_time = millis();
// }
// else if (millis() >= last_beep_time + BEEP_INTERVAL) {
// analogWrite(SOUND_PIN, 0);
// }
// }
// else {
// analogWrite(SOUND_PIN, 0); //Чтобы постоянно не пищал, если температура станет < 80 в то время, как пищалка включена
// }
} }
if (uint32_t(millis() - lastRpmCheck) >= RPM_CHECK_INTERVAL) { if (uint32_t(millis() - lastRpmCheck) >= RPM_CHECK_INTERVAL) {
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
#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 8 //Минимальная скважность ШИМ #define MIN_PWM_DUTY_CYCLE 2 //Минимальная скважность ШИМ
#define MAX_PWM_DUTY_CYCLE 254 //Максимальная скважность ШИМ #define MAX_PWM_DUTY_CYCLE 254 //Максимальная скважность ШИМ
#define DEFAULT_PWM_DUTY_CYCLE 254 //Скважность ШИМ по умолчанию (до подулючения к пк) #define DEFAULT_PWM_DUTY_CYCLE 254 //Скважность ШИМ по умолчанию (до подулючения к пк)
...@@ -181,7 +181,7 @@ void tempFromPc()// получаем температуру от пк ...@@ -181,7 +181,7 @@ void tempFromPc()// получаем температуру от пк
} }
} }
Serial.println("req_temperature_" + rpm_string + "_debug(pwm values):_" + String(OCR1A) + "_" + String(OCR2A) + "_" + String(OCR2B)); //запрос к пк Serial.println("req_temperature_" + rpm_string + "_debug_" + String(OCR1A) + "_" + String(OCR2A) + "_" + String(OCR2B)); //запрос к пк
unsigned long query_time = millis(); unsigned long query_time = millis();
while (Serial.available() == 0) { //ждем пока ответит while (Serial.available() == 0) { //ждем пока ответит
if (millis() >= query_time + GET_TEMP_TIMEOUT) { //если слишком долго не отвечает if (millis() >= query_time + GET_TEMP_TIMEOUT) { //если слишком долго не отвечает
...@@ -255,10 +255,9 @@ void rpm_control() { ...@@ -255,10 +255,9 @@ void rpm_control() {
fans[fan].revs = 0; fans[fan].revs = 0;
} }
for (int group = 0; group < 3; group++) {//управление скоростью 3-х групп вентиляторов for (int group = 0; group < 3; group++) {//управление скоростью 3-х групп вентиляторов
uint8_t duty_cycle = 0; uint8_t duty_cycle = 0;
if (temps[group] > 0) { if (temps[group] > 0) {
uint32_t avg_rpm = 0; uint32_t avg_rpm = 0;
...@@ -287,39 +286,42 @@ void rpm_control() { ...@@ -287,39 +286,42 @@ void rpm_control() {
duty_cycle = pwmDutyCycle; duty_cycle = pwmDutyCycle;
} }
} }
else { else {
duty_cycle = 0; duty_cycle = 0;
} }
set_duty_cycle(controls[group], duty_cycle);
if (duty_cycle < MIN_PWM_DUTY_CYCLE) {
controls[group].mode = 0; //всегда выкл
digitalWrite(controls[group].pin, 0);
}
else if (duty_cycle > MAX_PWM_DUTY_CYCLE) {
controls[group].mode = 2; //всегда вкл
digitalWrite(controls[group].pin, 1);
}
else {
controls[group].mode = 1; //шим
}
controls[group].dutyCycle = duty_cycle;
} }
lastRpmCheck = millis(); lastRpmCheck = millis();
} }
void set_duty_cycle(control &fanControl, uint16_t duty_cycle) {
if (duty_cycle < MIN_PWM_DUTY_CYCLE) {
fanControl.mode = 0; //всегда выкл
digitalWrite(fanControl.pin, 0);
fanControl.dutyCycle = 0;
}
else if (duty_cycle > MAX_PWM_DUTY_CYCLE) {
fanControl.mode = 2; //всегда вкл
digitalWrite(fanControl.pin, 1);
fanControl.dutyCycle = 255;
}
else {
fanControl.mode = 1; //шим
fanControl.dutyCycle = duty_cycle;
}
}
ISR(TIMER1_COMPA_vect) { //Функция, вызываемая при прерывании 1A ISR(TIMER1_COMPA_vect) { //Функция, вызываемая при прерывании 1A
if (control_a.mode < 2) { //если не всегда вкл if (control_a.mode < 2) { //если не всегда вкл
PORTD &= 0b1110111; //выкл питание на пине 3 PORTD &= 0b11110111; //выкл питание на пине 3
} }
} }
...@@ -340,16 +342,14 @@ ISR(TIMER2_COMPB_vect) { //Функция, вызываемая при прер ...@@ -340,16 +342,14 @@ ISR(TIMER2_COMPB_vect) { //Функция, вызываемая при прер
ISR(TIMER1_OVF_vect) { //Функция, вызываемая при переполнении таймера 1 ISR(TIMER1_OVF_vect) { //Функция, вызываемая при переполнении таймера 1
if (control_a.mode > 0) { //если режим шим или всегда вкл if (control_a.mode > 0) { //если режим шим или всегда вкл
digitalWrite(control_a.pin, 1); PORTD |= 0b00001000; //вкл питание на пине 3
} }
//delayMicroseconds(15);
for (int i = 0; i < 2; i++) { //проверка тахометров 0-1 for (int i = 0; i < 2; i++) { //проверка тахометров 0-1
if (digitalRead(fans[i].pin) == 0 && fans[i].state == 0) { //сигнал тахометра появился bool currentState = (PINC >> (fans[i].pin - 14)) & 0x01;
if (currentState == 0 && fans[i].state == 0) { //сигнал тахометра появился
fans[i].state = 1; fans[i].state = 1;
//digitalWrite(13, 1);
} }
else if (digitalRead(fans[i].pin) == 1 && fans[i].state == 1) { //сигнал тахометра пропал else if (currentState == 1 && fans[i].state == 1) { //сигнал тахометра пропал
//digitalWrite(13, 0);
fans[i].state = 0; fans[i].state = 0;
fans[i].revs++; //засчитывается оборот fans[i].revs++; //засчитывается оборот
} }
...@@ -365,32 +365,20 @@ ISR(TIMER2_OVF_vect) { //Функция, вызываемая при переп ...@@ -365,32 +365,20 @@ ISR(TIMER2_OVF_vect) { //Функция, вызываемая при переп
if (control_c.mode > 0) { //если режим шим или всегда вкл if (control_c.mode > 0) { //если режим шим или всегда вкл
PORTD |= 0b01000000; //вкл питание на пине 6 PORTD |= 0b01000000; //вкл питание на пине 6
} }
//delayMicroseconds(10);
for (int i = 2; i < 6; i++) { //проверка тахометров 2-5 for (int i = 2; i < 6; i++) { //проверка тахометров 2-5
if (digitalRead(fans[i].pin) == 0 && fans[i].state == 0) { //сигнал тахометра появился bool currentState = (PINC >> (fans[i].pin - 14)) & 0x01;
if (currentState == 0 && fans[i].state == 0) { //сигнал тахометра появился
fans[i].state = 1; fans[i].state = 1;
//digitalWrite(13, 1);
} }
else if (digitalRead(fans[i].pin) == 1 && fans[i].state == 1) { //сигнал тахометра пропал else if (currentState == 1 && fans[i].state == 1) { //сигнал тахометра пропал
//digitalWrite(13, 0);
fans[i].state = 0; fans[i].state = 0;
fans[i].revs++; //засчитывается оборот fans[i].revs++; //засчитывается оборот
} }
} }
} }
bool getbitstate(int num, uint8_t bit_pos) {
bool bits_array[8];
for (int i = 0; i < 8; i++) {
bits_array[i] = num >> (8 - 1 - i) & 1;
}
return bits_array[bit_pos];
}
void setup() { void setup() {
pinMode(LED_PIN, OUTPUT); pinMode(LED_PIN, OUTPUT);
...@@ -408,8 +396,6 @@ void setup() { ...@@ -408,8 +396,6 @@ void setup() {
//таймер 2 сравнение A - пин 5 //таймер 2 сравнение A - пин 5
//таймер 2 сравнение B - пин 6 //таймер 2 сравнение B - пин 6
//Пины 5 и 6: скважность от 8 до 255.
//режим таймера 1 (fast pwm 8 бит): //режим таймера 1 (fast pwm 8 бит):
TCCR1B |= (1 << WGM12); TCCR1B |= (1 << WGM12);
TCCR1A |= (1 << WGM10); TCCR1A |= (1 << WGM10);
...@@ -425,8 +411,8 @@ void setup() { ...@@ -425,8 +411,8 @@ void setup() {
TIMSK2 |= (1 << OCIE2B); //вкл. вызов прерывания таймера 2 по сравнению B TIMSK2 |= (1 << OCIE2B); //вкл. вызов прерывания таймера 2 по сравнению B
TIMSK2 |= (1 << TOIE2); //вкл. вызов прерывания при переполнении таймера 2 TIMSK2 |= (1 << TOIE2); //вкл. вызов прерывания при переполнении таймера 2
for (int i = 0; i < CONTROL_COUNT; i++) { for (int i = 0; i < CONTROL_COUNT; i++) { //установка скважности по умолчанию
controls[i].dutyCycle = DEFAULT_PWM_DUTY_CYCLE; //установка скважности по умолчанию set_duty_cycle(controls[i], DEFAULT_PWM_DUTY_CYCLE);
} }
Serial.begin(BAUDRATE); Serial.begin(BAUDRATE);
...@@ -442,20 +428,6 @@ void loop() { ...@@ -442,20 +428,6 @@ void loop() {
if (uint32_t(millis() - last_check_time) >= CHECK_TEMP_DELAY) { if (uint32_t(millis() - last_check_time) >= CHECK_TEMP_DELAY) {
last_check_time = millis(); last_check_time = millis();
tempFromPc();//получаем температуру от пк tempFromPc();//получаем температуру от пк
// if (temp >= 80) { //Если перегрев, включается пищалка
// if (millis() >= last_beep_time + BEEP_INTERVAL * 2) {
// analogWrite(SOUND_PIN, BEEP_STRENGTH);
// last_beep_time = millis();
// }
// else if (millis() >= last_beep_time + BEEP_INTERVAL) {
// analogWrite(SOUND_PIN, 0);
// }
// }
// else {
// analogWrite(SOUND_PIN, 0); //Чтобы постоянно не пищал, если температура станет < 80 в то время, как пищалка включена
// }
} }
if (uint32_t(millis() - lastRpmCheck) >= RPM_CHECK_INTERVAL) { if (uint32_t(millis() - lastRpmCheck) >= RPM_CHECK_INTERVAL) {
......
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