volatile unsigned longtime_old = 0; //предыдущее время
03
intspeeed = 0;
04
05
voidsetup(){
06
delay(120000); //подождем 2 мин на начальном этапе
07
Serial.begin(9600);
08
attachInterrupt(0, impuls, RISING); //Прерывание по нарастающему фронту на D2
09
}
10
voidloop(){
11
noInterrupts();
12
speeed = 60000/(time-time_old); //вычисляем скорость в об/мин
13
interrupts();
14
Serial.println(speeed);
15
delay(200);
16
}
17
voidimpuls(){ // сработал датчик
18
time_old = time;
19
time = millis();
20
}
В моем случае прерывание в момент рассчета не произойдет, а произойдет оно ПОСЛЕ рассчета. Т.е. разумеется это не очень хорошо, но скачков быть не должно.
пункт 88 скорость регулируеться с задержкой. скачков небыло. значения скорости округляються к десяткам скачков небыло
пункт 94(1) тоже что и в пункте 88
пункт 94(2) скорость меняеться сразу бывают разовые скачки
пункт 95 скорость регулируеться нормально дает высокие скачки часто но не подряд
пункт 97 скорость показывает 290-300 при регулеровке скорости значения на мониторе остаються неизменными теже 300. если понижаю обороты на двигателе меньше 300 выдает разовые скачки (на мониторе) 150 если поднимаю выше 300 скачков нет.
пункт 103 скорость регулируеться нормально скачков нет
Чтобы было понятно, для чего используется запрет прерываний, вижу постоянно некорректное использование, объясню.
Запрет прерываний нужен только для того, чтобы в момент расчета speeed, не изменилось значение переменных time & time_old. Запрещать прерывания ДОЛЬШЕ расчета - чревато увеличением нелинейности рассчета, пусть небольшой, но это лишнее. Потому, запрет пререваний нужен только на время использования переменных time & time_old, после чего нужно их быстро разрешить, т.е. должно быть просто запрет прерываний, расчет speeed и обратно разрешение прерываний, все остальные варианты - некорректны.
Для тех, кто не совсем понимает, посмотрите ассемблерный листинг и увидите, что расчет speeed происходит за несколько команд, таким образом, например, МК может считать во внутренние регистры значение time, а потом происходит прерывание и значение переменной time изменяется, но МК в регистрах использует старое и уже некорректное значение.
Чтобы было понятно, для чего используется запрет прерываний, вижу постоянно некорректное использование, объясню.
Запрет прерываний нужен только для того, чтобы в момент расчета speeed, не изменилось значение переменных time & time_old. Запрещать прерывания ДОЛЬШЕ расчета - чревато увеличением нелинейности рассчета, пусть небольшой, но это лишнее. Потому, запрет пререваний нужен только на время использования переменных time & time_old, после чего нужно их быстро разрешить, т.е. должно быть просто запрет прерываний, расчет speeed и обратно разрешение прерываний, все остальные варианты - некорректны.
Для тех, кто не совсем понимает, посмотрите ассемблерный листинг и увидите, что расчет speeed происходит за несколько команд, таким образом, например, МК может считать во внутренние регистры значение time, а потом происходит прерывание и значение переменной time изменяется, но МК в регистрах использует старое и уже некорректное значение.
126 ПРИ НИЗКИХ ОБОРОТАХ НАЧИНАЕТ СХОДИТЬ С УМА ВПЕРЕД НАЗАД. ПРИ ВЫСОКИХ ОБОРОТАХ ФИКСИРУЕТЬСЯ В ПОЛОЖЕНИИ РЕЛЕ HIGH КАК ДОЛЖНО БЫТЬ ПРИ НИЗКИХ ОБОРОТАХ
126 реле нормально разомкнутое. работает нормально периодически случаютьсч мелкие всплески. сейчас система работает при низких оборотах реле выключено при высоких включено. мне надо наоборот т.к. при пропадании питания на плате реле было разомкнуто тем самым автоматически будет уводить из под ветра.
при достижении 250 об срабатывает реле и фиксируеться.
при быстром понижении на 220 об реле переключаеться и фиксируеться.
при медленном понижении до 220 примерно в течении 3 мин реле пульсирует и актуатор остаеться в закрытом состоянии (как при высоких оборотах) при этом реле находиться под напряжением (как при низких оборотах) понижение оборотов до нуля не выводит реле из этого состояния.
выход из этого состояния:
1: поднять обороты до 250 тогда происходит переключение и работа возобновляеться в нормальном режиме
при поднятии оборотов от 0 до промежутка 220-245 об первое время мин 10 работает нормально потом начинает давать сбои примерно каждые 5-10 мин длительностью 30-60 сек.
при понижении оборотов с 260 до 220 постоянные сбои очень длительные доходит до залипания контактов реле если в течении до 3 мин не понизить обороты до 217
я думал как это можно решить. возможно и не в программе дело, а в датчике. а если так, и он изредка дает некорректные данные то будем считать не абсолютное значение скорости а среднее. набросаю код, завтра наверно уже. среднее значение должно избавить от возможных всплесков. если и это не поможет буду думать дальше
volatile unsigned longtime_old = 0; //предыдущее время
04
intspeeed = 0;
05
boolean flag = 0;
06
07
voidsetup(){
08
delay(120000); //подождем 2 мин на начальном этапе
09
pinMode(rele, OUTPUT);
10
digitalWrite(rele, LOW);
11
Serial.begin(9600);
12
attachInterrupt(0, impuls, RISING); //Прерывание по нарастающему фронту на D2
13
}
14
voidloop(){
15
if(flag == 1){
16
speeed = 60000/(time-time_old); //вычисляем скорость в об/мин
17
if(speeed >= 250){
18
digitalWrite(rele, HIGH);
19
//delay(30000);
20
}
21
else{
22
digitalWrite(rele, LOW);
23
}
24
flag = 0;
25
Serial.println(speeed);
26
}
27
}
28
voidimpuls(){ // сработал датчик
29
time_old = time;
30
time = millis();
31
flag = 1;
32
}
возможно усреднение не понадобится. частота мала, и расчет если проводить между импульсами не должно повлиять. если будут все равно броски сделаем усреднение
обороты поднимаються до 250 об нормально. на 250 сработало реле (замкнуло цепь на увод хвоста) пока обороты 250+ реле замкнуто в этом положении. все нормально.
начинаю медленно понижать обороты. вне зависимости за сколько времени понижаются обороты 15 сек или 3 мин и более. с верхней границы 249 и до нижней границы 230 оборотов. реле пульсирует (меняет полярность) и актуатор поворачивает хвост рывками (длина выдвижения штока актуатора 100 мм) периодами выдвигается шток до конца и сразу задвигаеться до конца в промежутках между такими периодами выдвигаеться примерно на 5-10 мм задвигаеться обратно. (по принципу 2 шага вперед 1 назад 2 вперед 3 назад). и таким образом пока не доходит до 230 оборотов.
дошло до 230 об стабилизировалось и ждет пока обороты не поднимуться до 250 об
про актуатор это уже лишнее. итого. до 250 нормально. на 250 срабатывает реле. если медленно понижать обороты от 249 до 230 оборотов реле постоянно переключается
если уменьшилось до 230 включается пока не увеличатся обороты до 250
так?
если так. все нормлаьно работает, но в диапазоне от 249 до 230 (только при понижении) реле туда сюда переключается. правильно?
обороты поднимаються до 250 об нормально. на 250 сработало реле (замкнуло цепь на увод хвоста) пока обороты 250+ реле замкнуто в этом положении. все нормально.
начинаю медленно понижать обороты. вне зависимости за сколько времени понижаются обороты 15 сек или 3 мин и более. с верхней границы 249 и до нижней границы 230 оборотов. реле пульсирует (меняет полярность) и актуатор поворачивает хвост рывками (длина выдвижения штока актуатора 100 мм) периодами выдвигается шток до конца и сразу задвигаеться до конца в промежутках между такими периодами выдвигаеться примерно на 5-10 мм задвигаеться обратно. (по принципу 2 шага вперед 1 назад 2 вперед 3 назад). и таким образом пока не доходит до 230 оборотов.
дошло до 230 об стабилизировалось и ждет пока обороты не поднимуться до 250 об
А не могли бы вы схему нарисовать, хотя бы на бумажке(сфоткать и выложить сюда)
У меня складываеться впечатление что вам не совсем то пытаються зделать.
Особенно про актуатор, хвост поподробнее. Что к чему у вас подключено...
на сигнальном проводе у меня 3.5 В и табло показывает обороты. когда подаю питание от АКБ на плату на сигнальном проводе получаю 245 мВ и на табло пропадают обороты(показывает 0).
сигнальный на D2. питание на VIN и GND 12В. схему подключения не менял. до этого работало нормально. сегодня подключаю сигнал пропадает. убираю питание с платы, а сигнальный остаеться подключенным к плате, на табло появляються обороты.
последний вариант 97
последний вариант самый точный, и к тому же разовый скачок вниз меньше портит по моему чем вверх
я честно сказать уже хз что тут еще сделать. может позже еще что нибудь придумаю
скачки также случайные или через определенный промежуток времени?
Мое предложение несколько другое, не отключать обработчик (это важно), а запрещать прерывания, а это разные вещи:
01
volatile unsigned
long
time = 0;
//Время срабатывания датчика
02
volatile unsigned
long
time_old = 0;
//предыдущее время
03
int
speeed = 0;
04
05
void
setup
(){
06
delay(120000);
//подождем 2 мин на начальном этапе
07
Serial
.begin(9600);
08
attachInterrupt(0, impuls, RISING);
//Прерывание по нарастающему фронту на D2
09
}
10
void
loop
(){
11
noInterrupts();
12
speeed = 60000/(time-time_old);
//вычисляем скорость в об/мин
13
interrupts();
14
Serial
.println(speeed);
15
delay(200);
16
}
17
void
impuls(){
// сработал датчик
18
time_old = time;
19
time = millis();
20
}
В моем случае прерывание в момент рассчета не произойдет, а произойдет оно ПОСЛЕ рассчета. Т.е. разумеется это не очень хорошо, но скачков быть не должно.
это вариант оказался лучшим. такой скачек вниз я думаю не будет мешать. попробовать теперь добавить реле и посмотреть как себя поведет
я немного видно неправильно понял kisoft. попробуем так как он советует плюс мои предыдущие доработки
01
volatile unsigned
long
time = 0;
//Время срабатывания датчика
02
volatile unsigned
int
speeed = 0;
03
04
void
setup
(){
05
delay(120000);
//подождем 2 мин на начальном этапе
06
Serial
.begin(9600);
07
attachInterrupt(0, impuls, RISING);
//Прерывание по нарастающему фронту на D2
08
}
09
void
loop
(){
10
noInterrupts();
11
Serial
.println(speeed);
12
delay(200);
13
interrupts();
14
}
15
void
impuls(){
// сработал датчик
16
speeed = 60000/(millis() - time);
//вычисляем скорость в об/мин
17
time = millis();
18
}
попробуй это а потом уже реле подцепим
сообщение 103 стабильны показания разовые не частые скачки -1 и 560
подождал 2 мин на дисплее выдал ряд единиц в конце 3750 и завис
а из 105?
уже голова не работает. может так стабильнее будет
01
volatile unsigned
long
time = 0;
//Время срабатывания датчика
02
volatile unsigned
int
speeed = 0;
03
04
void
setup
(){
05
delay(120000);
//подождем 2 мин на начальном этапе
06
Serial
.begin(9600);
07
attachInterrupt(0, impuls, RISING);
//Прерывание по нарастающему фронту на D2
08
}
09
void
loop
(){
10
noInterrupts();
11
Serial
.println(speeed);
12
delay(200);
13
interrupts();
14
attachInterrupt(0, impuls, RISING);
15
}
16
void
impuls(){
// сработал датчик
17
speeed = 60000/(millis() - time);
//вычисляем скорость в об/мин
18
time = millis();
19
}
из 105 я написал в 107
108 выдал единицы и завис(не меняет значения)
ну хорошо 108
если нет остановимся на том со скачком вниз. если меня позже еще не осенит
из 97 протестируйте подольше и будем уже реле юзать
у меня на плате какойто баг . как обнулить память платы?
в смысле обнулить? при програмировании все затирается кроме бутлоадера
уже разобрался спасибо тестирую заново
протестировал заново
пункт 88 скорость регулируеться с задержкой. скачков небыло. значения скорости округляються к десяткам скачков небыло
пункт 94(1) тоже что и в пункте 88
пункт 94(2) скорость меняеться сразу бывают разовые скачки
пункт 95 скорость регулируеться нормально дает высокие скачки часто но не подряд
пункт 97 скорость показывает 290-300 при регулеровке скорости значения на мониторе остаються неизменными теже 300. если понижаю обороты на двигателе меньше 300 выдает разовые скачки (на мониторе) 150 если поднимаю выше 300 скачков нет.
пункт 103 скорость регулируеться нормально скачков нет
ну и отлично. завтра добавлю для реле код, или можете добавить строки сами за кода что был ранее
пробуйте
01
#define rele 10
02
volatile unsigned
long
time = 0;
//Время срабатывания датчика
03
volatile unsigned
long
time_old = 0;
//предыдущее время
04
int
speeed = 0;
05
06
void
setup
(){
07
delay(120000);
//подождем 2 мин на начальном этапе
08
pinMode(rele, OUTPUT);
09
digitalWrite(rele, HIGH);
10
Serial
.begin(9600);
11
attachInterrupt(0, impuls, RISING);
//Прерывание по нарастающему фронту на D2
12
}
13
void
loop
(){
14
noInterrupts();
15
speeed = 60000/(time-time_old);
//вычисляем скорость в об/мин
16
if
(speeed >= 250){
17
digitalWrite(rele, LOW);
18
delay(30000);
19
}
20
else
{
21
digitalWrite(rele, HIGH);
22
}
23
interrupts();
24
Serial
.println(speeed);
25
delay(200);
26
}
27
void
impuls(){
// сработал датчик
28
time_old = time;
29
time = millis();
30
}
Спасибо в воскресенье буду проверять
Чтобы было понятно, для чего используется запрет прерываний, вижу постоянно некорректное использование, объясню.
Запрет прерываний нужен только для того, чтобы в момент расчета speeed, не изменилось значение переменных time & time_old. Запрещать прерывания ДОЛЬШЕ расчета - чревато увеличением нелинейности рассчета, пусть небольшой, но это лишнее. Потому, запрет пререваний нужен только на время использования переменных time & time_old, после чего нужно их быстро разрешить, т.е. должно быть просто запрет прерываний, расчет speeed и обратно разрешение прерываний, все остальные варианты - некорректны.
Для тех, кто не совсем понимает, посмотрите ассемблерный листинг и увидите, что расчет speeed происходит за несколько команд, таким образом, например, МК может считать во внутренние регистры значение time, а потом происходит прерывание и значение переменной time изменяется, но МК в регистрах использует старое и уже некорректное значение.
Чтобы было понятно, для чего используется запрет прерываний, вижу постоянно некорректное использование, объясню.
Запрет прерываний нужен только для того, чтобы в момент расчета speeed, не изменилось значение переменных time & time_old. Запрещать прерывания ДОЛЬШЕ расчета - чревато увеличением нелинейности рассчета, пусть небольшой, но это лишнее. Потому, запрет пререваний нужен только на время использования переменных time & time_old, после чего нужно их быстро разрешить, т.е. должно быть просто запрет прерываний, расчет speeed и обратно разрешение прерываний, все остальные варианты - некорректны.
Для тех, кто не совсем понимает, посмотрите ассемблерный листинг и увидите, что расчет speeed происходит за несколько команд, таким образом, например, МК может считать во внутренние регистры значение time, а потом происходит прерывание и значение переменной time изменяется, но МК в регистрах использует старое и уже некорректное значение.
спасибо за объяснение
Спасибо
проверял 118 дает сбои частые высокие скачки
01
#define rele 10
02
volatile unsigned
long
time = 0;
//Время срабатывания датчика
03
volatile unsigned
long
time_old = 0;
//предыдущее время
04
int
speeed = 0;
05
06
void
setup
(){
07
delay(120000);
//подождем 2 мин на начальном этапе
08
pinMode(rele, OUTPUT);
09
digitalWrite(rele, HIGH);
10
Serial
.begin(9600);
11
attachInterrupt(0, impuls, RISING);
//Прерывание по нарастающему фронту на D2
12
}
13
void
loop
(){
14
noInterrupts();
15
speeed = 60000/(time-time_old);
//вычисляем скорость в об/мин
16
interrupts();
17
if
(speeed >= 250){
18
digitalWrite(rele, LOW);
19
delay(30000);
20
}
21
else
{
22
digitalWrite(rele, HIGH);
23
}
24
25
Serial
.println(speeed);
26
delay(200);
27
}
28
void
impuls(){
// сработал датчик
29
time_old = time;
30
time = millis();
31
}
в 124 при низких оборотах каждые 30 сек дает скачек. при поднятии оборотов выше 250 проверки нет и реле не реагирует
01
#define rele 10
02
volatile unsigned
long
time = 0;
//Время срабатывания датчика
03
volatile unsigned
long
time_old = 0;
//предыдущее время
04
int
speeed = 0;
05
06
void
setup
(){
07
delay(120000);
//подождем 2 мин на начальном этапе
08
pinMode(rele, OUTPUT);
09
digitalWrite(rele, HIGH);
10
//Serial.begin(9600);
11
attachInterrupt(0, impuls, RISING);
//Прерывание по нарастающему фронту на D2
12
}
13
void
loop
(){
14
noInterrupts();
15
speeed = 60000/(time-time_old);
//вычисляем скорость в об/мин
16
interrupts();
17
if
(speeed >= 250){
18
digitalWrite(rele, LOW);
19
//delay(30000);
20
}
21
else
{
22
digitalWrite(rele, HIGH);
23
}
24
25
//Serial.println(speeed);
26
//delay(200);
27
}
28
void
impuls(){
// сработал датчик
29
time_old = time;
30
time = millis();
31
}
попробуем без 30 сек задержки
126 ПРИ НИЗКИХ ОБОРОТАХ НАЧИНАЕТ СХОДИТЬ С УМА ВПЕРЕД НАЗАД. ПРИ ВЫСОКИХ ОБОРОТАХ ФИКСИРУЕТЬСЯ В ПОЛОЖЕНИИ РЕЛЕ HIGH КАК ДОЛЖНО БЫТЬ ПРИ НИЗКИХ ОБОРОТАХ
мотор к реле поключен к нормлально разомкнутым контактам?
скетч еще раз скопируйте и попробуйте. я его подправил. терминал отключил. незнаю с какой вы испльзовали
126 реле нормально разомкнутое. работает нормально периодически случаютьсч мелкие всплески. сейчас система работает при низких оборотах реле выключено при высоких включено. мне надо наоборот т.к. при пропадании питания на плате реле было разомкнуто тем самым автоматически будет уводить из под ветра.
если наоборот получается нормально замкнутое
01
#define rele 10
02
volatile unsigned
long
time = 0;
//Время срабатывания датчика
03
volatile unsigned
long
time_old = 0;
//предыдущее время
04
int
speeed = 0;
05
06
void
setup
(){
07
delay(120000);
//подождем 2 мин на начальном этапе
08
pinMode(rele, OUTPUT);
09
digitalWrite(rele, LOW);
10
//Serial.begin(9600);
11
attachInterrupt(0, impuls, RISING);
//Прерывание по нарастающему фронту на D2
12
}
13
void
loop
(){
14
noInterrupts();
15
speeed = 60000/(time-time_old);
//вычисляем скорость в об/мин
16
interrupts();
17
if
(speeed >= 250){
18
digitalWrite(rele, HIGH);
19
//delay(30000);
20
}
21
else
{
22
digitalWrite(rele, LOW);
23
}
24
25
//Serial.println(speeed);
26
//delay(200);
27
}
28
void
impuls(){
// сработал датчик
29
time_old = time;
30
time = millis();
31
}
130 работает почти нормально.
при достижении 250 об срабатывает реле и фиксируеться.
при быстром понижении на 220 об реле переключаеться и фиксируеться.
при медленном понижении до 220 примерно в течении 3 мин реле пульсирует и актуатор остаеться в закрытом состоянии (как при высоких оборотах) при этом реле находиться под напряжением (как при низких оборотах) понижение оборотов до нуля не выводит реле из этого состояния.
выход из этого состояния:
1: поднять обороты до 250 тогда происходит переключение и работа возобновляеться в нормальном режиме
2: выключить питание платы
в промежутке 220-250 об работает не стабильно
при поднятии оборотов от 0 до промежутка 220-245 об первое время мин 10 работает нормально потом начинает давать сбои примерно каждые 5-10 мин длительностью 30-60 сек.
при понижении оборотов с 260 до 220 постоянные сбои очень длительные доходит до залипания контактов реле если в течении до 3 мин не понизить обороты до 217
я думал как это можно решить. возможно и не в программе дело, а в датчике. а если так, и он изредка дает некорректные данные то будем считать не абсолютное значение скорости а среднее. набросаю код, завтра наверно уже. среднее значение должно избавить от возможных всплесков. если и это не поможет буду думать дальше
спасибо
вот пока без усреднения, но с расчетами между импульсами. смотрите также в терминал
01
#define rele 10
02
volatile unsigned
long
time = 0;
//Время срабатывания датчика
03
volatile unsigned
long
time_old = 0;
//предыдущее время
04
int
speeed = 0;
05
boolean flag = 0;
06
07
void
setup
(){
08
delay(120000);
//подождем 2 мин на начальном этапе
09
pinMode(rele, OUTPUT);
10
digitalWrite(rele, LOW);
11
Serial
.begin(9600);
12
attachInterrupt(0, impuls, RISING);
//Прерывание по нарастающему фронту на D2
13
}
14
void
loop
(){
15
if
(flag == 1){
16
speeed = 60000/(time-time_old);
//вычисляем скорость в об/мин
17
if
(speeed >= 250){
18
digitalWrite(rele, HIGH);
19
//delay(30000);
20
}
21
else
{
22
digitalWrite(rele, LOW);
23
}
24
flag = 0;
25
Serial
.println(speeed);
26
}
27
}
28
void
impuls(){
// сработал датчик
29
time_old = time;
30
time = millis();
31
flag = 1;
32
}
возможно усреднение не понадобится. частота мала, и расчет если проводить между импульсами не должно повлиять. если будут все равно броски сделаем усреднение
пока дает пульсации в пределах 230-250 об.
может попробовать алгоритм при достижении 250 об сработало реле и ждет пока обороты не упадут до 210 об. (сработало реле).
сделать систему пожестче.
может описать подробнее. непонятно же какие пульсации да еще и в диапазоне
у вас поразительная способность скрывать факты, либо выдавать так что толку от них почти нет. подробнее
обороты поднимаються до 250 об нормально. на 250 сработало реле (замкнуло цепь на увод хвоста) пока обороты 250+ реле замкнуто в этом положении. все нормально.
начинаю медленно понижать обороты. вне зависимости за сколько времени понижаются обороты 15 сек или 3 мин и более. с верхней границы 249 и до нижней границы 230 оборотов. реле пульсирует (меняет полярность) и актуатор поворачивает хвост рывками (длина выдвижения штока актуатора 100 мм) периодами выдвигается шток до конца и сразу задвигаеться до конца в промежутках между такими периодами выдвигаеться примерно на 5-10 мм задвигаеться обратно. (по принципу 2 шага вперед 1 назад 2 вперед 3 назад). и таким образом пока не доходит до 230 оборотов.
дошло до 230 об стабилизировалось и ждет пока обороты не поднимуться до 250 об
про актуатор это уже лишнее. итого. до 250 нормально. на 250 срабатывает реле. если медленно понижать обороты от 249 до 230 оборотов реле постоянно переключается
если уменьшилось до 230 включается пока не увеличатся обороты до 250
так?
если так. все нормлаьно работает, но в диапазоне от 249 до 230 (только при понижении) реле туда сюда переключается. правильно?
да
обороты поднимаються до 250 об нормально. на 250 сработало реле (замкнуло цепь на увод хвоста) пока обороты 250+ реле замкнуто в этом положении. все нормально.
начинаю медленно понижать обороты. вне зависимости за сколько времени понижаются обороты 15 сек или 3 мин и более. с верхней границы 249 и до нижней границы 230 оборотов. реле пульсирует (меняет полярность) и актуатор поворачивает хвост рывками (длина выдвижения штока актуатора 100 мм) периодами выдвигается шток до конца и сразу задвигаеться до конца в промежутках между такими периодами выдвигаеться примерно на 5-10 мм задвигаеться обратно. (по принципу 2 шага вперед 1 назад 2 вперед 3 назад). и таким образом пока не доходит до 230 оборотов.
дошло до 230 об стабилизировалось и ждет пока обороты не поднимуться до 250 об
А не могли бы вы схему нарисовать, хотя бы на бумажке(сфоткать и выложить сюда)
У меня складываеться впечатление что вам не совсем то пытаються зделать.
Особенно про актуатор, хвост поподробнее. Что к чему у вас подключено...
а как взаимосвязаны двигатель-генератор -- блок управления актуатором -- редуктор -- ховст ?
Почемуто всё это мне напоминает ветрогенератор, хотя наверное и ошибаюсь
так оно и есть это система управления поворотом ветрогенератора. увода из под ветра при увеличении оборотов генератора
это не редуктор а актуатор
так оно и есть это система управления поворотом ветрогенератора. увода из под ветра при увеличении оборотов генератора
Насколько я в курсе ротор поворачивают редко,
обычно при превышении оборотов ( то есть напряжения на выходе ) нагружают генератор мощьной
нагрузкой (или даже закорачивают выход). И это делает обычный контроллер заряда.
Может быть вам надо пойти по этому пути, а не крутить его?
Например
http://www.ebay.com/itm/Wind-Charge-Controller-for-100W-200W-300W-12V-fo...
1 .Automatic dump load while the wind turbine generator overload.
2. Batteries overcharge or over discharge protection.
3. Battery reverse connection protection, Lightning protection
4. Wind turbine current limiting, Wind turbine automatic brake and manual brake
5. Protect cable connect to batteries inverse.
6. Protect electric shock.
7. Water proof
System voltage
12V
Rated power for wind turbine
100~300W
Brake Start Voltage
15V
Brake Recover Voltage
13.5V
Brake Start Current
15A
Display Model
LED
Output route
single way
Ambient temperature
-35 - +75 °c
Size
96X76X21mm
Safe degree
IP67
попробуйте так. ввел усреднение и "жесткие условия"
01
#define rele 10
02
volatile unsigned
long
time = 0;
//Время срабатывания датчика
03
volatile unsigned
long
time_old = 0;
//предыдущее время
04
int
speeed = 0;
05
boolean flag = 0;
06
07
int
mass[5] = {0,0,0,0,0};
08
byte
first = 0;
09
10
void
setup
(){
11
delay(120000);
//подождем 2 мин на начальном этапе
12
pinMode(rele, OUTPUT);
13
digitalWrite(rele, LOW);
14
attachInterrupt(0, impuls, RISING);
//Прерывание по нарастающему фронту на D2
15
}
16
void
loop
(){
17
if
(flag == 1){
18
speeed = 60000/(time-time_old);
//вычисляем скорость в об/мин
19
20
//========================================================================
21
// Первый раз заполняем массив одинаковыми значениями измеренной скорости
22
// Выполняется только 1 раз после первого измерения
23
24
if
( first == 1){
25
for
(
int
i=0; i<5; i++){
26
mass[i] = speeed;
27
first++;
28
}
29
}
30
31
//========================================================================
32
// Вычисляем среднее
33
for
(
int
i=0; i<4; i++){
34
mass[i] = mass[i+1];
35
}
36
mass[4] = speeed;
37
for
(
int
i=0; i<5; i++){
38
speeed += mass[i];
39
}
40
speeed /= 5;
41
//========================================================================
42
// Управляем реле
43
44
if
(speeed >= 250){
45
digitalWrite(rele, HIGH);
46
}
47
if
(speeed <= 210){
48
digitalWrite(rele, LOW);
49
}
50
flag = 0;
51
}
52
}
53
54
//========================================================================
55
// Подпрограмма прерывания
56
void
impuls(){
57
time_old = time;
58
time = millis();
59
flag = 1;
60
if
(first == 0){
61
first++;
62
}
63
}
на сигнальном проводе у меня 3.5 В и табло показывает обороты. когда подаю питание от АКБ на плату на сигнальном проводе получаю 245 мВ и на табло пропадают обороты(показывает 0).
а на плату куда подаете питание? на какой вывод?
или на разъем?
плата не должна влиять. там работает в режиме входа
сигнальный на D2. питание на VIN и GND 12В. схему подключения не менял. до этого работало нормально. сегодня подключаю сигнал пропадает. убираю питание с платы, а сигнальный остаеться подключенным к плате, на табло появляються обороты.