#1 2017-05-04 23:33:10

yarikne
Учасник
З Херсон
Зареєстрований: 2017-05-04
Повідомлень: 13

Управление вентилятором радиатора автомобиля, разработка.

Дано мерс w124;
У него два эл. вентилятора с потреблением 30А;
Ардуино Леонардо;
16х2 + I2C;
Датчик температуры штатный в автомобиле, резистивный.
При температуре 20 градусов напряжение 4,5в, при 90 2в. (Более детальная таблица в разработке);

Необходимо:
- Считывание температуры с датчика согласно таблице, вывод на ЛСД
- ШИМ управление вентилятором согласно заданным параметром (Например: Запуск на 30% при т 80градусов и плавный набор оборотов до 100% при 110 градусов и выше)
- Включение для работы с кондиционером при внешнем управлении, 2 входа 50 и 100%
- Аварийный запуск при обрыве цепи датчика температуры

Силовая часть будет выглядеть, как мощный полевик либо будет использован блок управления вентилятором от серийных авто, например такой, ему нужен шим частотой от 100 до 200гц и скважностью от 10 до 90% (как я понял частоту от 100 до 200 сложно реализовать на ардуино).


Пока удалось лишь слепить набросок из чужих кодов

#include <LiquidCrystal_I2C.h>
    //источник: http://www.electroschematics.com/9540/arduino-fan-speed-controlled-temperature/
    LiquidCrystal_I2C lcd(0x3F, 16, 2);
    int tempPin = A0; // Вход сигнала температуры
    int fan = 11; // вывод на вентилятор
    int led = 8; // вывод на светодиод
    int temp;    // Температура в градусах
    int tempMin = 30; // температура начала вращения вентилятора
    int tempMax = 70; // максимальная температура, когда вентилятор вращается на 100%
    int fanSpeed;     // скорость вентилятора в ??
    int fanLCD;       //Переменная для вывода процентов скорости вентилятора на экран
    
    void setup() {
    pinMode(fan, OUTPUT);
    pinMode(led, OUTPUT);
    pinMode(tempPin, INPUT);
    lcd.begin();
    }
     
    void loop() {
  int sensorValue = analogRead(A0);    // Переменная для приобразования в вольты
      // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
  float voltage = sensorValue * (5.0 / 1023.0);
 
  
    temp = readTemp(); // получаем температуру
    if(temp < tempMin) { // если temp меньше минимума
    fanSpeed = 0; // кулер не вращается
    digitalWrite(fan, LOW);
    }
    if((temp >= tempMin) && (temp <= tempMax)) { // если temp больше минимума
    fanSpeed = map(temp, tempMin, tempMax, 32, 255); // текущая скорость вентилятора
    fanLCD = map(temp, tempMin, tempMax, 0, 100); // скорость вращения для отображения на LCD
    analogWrite(fan, fanSpeed); // вращаем кулер со скоростью fanSpeed
    }
    if(temp > tempMax) { // если temp больше максимума
    digitalWrite(led, HIGH); // включаем светодиод
    } else { // иначе выключаем светодиод
    digitalWrite(led, LOW);
    }
    lcd.print("TEMP: ");
    lcd.print(temp); // отображение температуры
    lcd.print("C ");
    lcd.print(voltage); // отображение температуры
    lcd.print("V ");
    lcd.setCursor(0,1); // перевод курсора на следующую сторку
    lcd.print("FANS: ");
    lcd.print(fanLCD); // отображение скорости вращения вентилятора
    lcd.print("%");
    delay(200);
    lcd.clear();
    }
     
    int readTemp() { // получить температуру и переконвертировать ее в цельсии
    temp = analogRead(tempPin);
    return temp * 0.2;
    }

и вот код, который пока не понятен и не интегрирован. В нем используется таблица.

float addr[151][2] = {
{0,28.0170},
{1,26.8255},
{2,25.6972},
{3,24.6290},
{4,23.6176},
{5,22.6597},
{6,21.7522},
{7,20.8916},
{8,20.0749},
{9,19.2988},
{10,18.5600},
{11,18.4818},
{12,18.1489},
{13,17.6316},
{14,16.9917},
{15,16.2797},
{16,15.5350},
{17,14.7867},
{18,14.0551},
{19,13.3536},
{20,12.6900},
{21,12.0684},
{22,11.4900},
{23,10.9539},
{24,10.4582},
{25,10.0000},
{26,9.5762},
{27,9.1835},
{28,8.8186},
{29,8.4784},
{30,8.1600},
{31,7.8608},
{32,7.5785},
{33,7.3109},
{34,7.0564},
{35,6.8133},
{36,6.5806},
{37,6.3570},
{38,6.1418},
{39,5.9343},
};
 
void setup() {
Serial.begin(9600);
pinMode(A0,INPUT) ;
}
 
void loop() {
Serial.println(analogRead(A0));
Serial.println(getTemp(analogRead(A0)));
delay(2000);
}
 
float getR(float V)
{
float result;
result=-10*V/(V-1024);
return result;
}
 
float getTemp(float V)
{
float R;
R=getR(V);
int i=0;
while (addr[i][1] >R)
{
i++;
}
float result;
result=(R-addr[i][1])*(addr[i-1][0]-addr[i][0])/(addr[i-1][1]-addr[i][1])+addr[i][0];
return result;
}

Не понятно, что за числа в таблице...


На данном этапе код не работает, так как:
1. Не интегрирована таблица
2. Если запустить схему с температурой 100 градусов вентилятор не запускается (Нужно попасть в диапазон от 30 до70)
3. Нужно инвертировать зависимость температуры от напряжения при повышении напряжения растет и температура, нужно наоборот.

Буду благодарен любым подсказкам, очень хочу научится программировать ардуинки.

Неактивний

#2 2017-05-04 23:52:10

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Управление вентилятором радиатора автомобиля, разработка.

"Не понятно, что за числа в таблице..."
похоже на  linear interpolation

если хочете - научитесь )
но leonardo врядли лучшее решение для авто.

Неактивний

#3 2017-05-05 07:11:39

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 876

Re: Управление вентилятором радиатора автомобиля, разработка.

вы только начинаете, поэтому вам понятнее и проще делать по этапам
запустите дисплей
запустите вент, научитесь им управлять
потом температурой займитесь
ну а дальше всё в кучу

Неактивний

#4 2017-05-05 19:14:27

yarikne
Учасник
З Херсон
Зареєстрований: 2017-05-04
Повідомлень: 13

Re: Управление вентилятором радиатора автомобиля, разработка.

vvr пише:

вы только начинаете, поэтому вам понятнее и проще делать по этапам
запустите дисплей
запустите вент, научитесь им управлять
потом температурой займитесь
ну а дальше всё в кучу

1 - Дисплей запустил, принципы вывода информации на дисплей понял. На данном этапе вывожу на дисплей Напряжение с А0 в вольтах, скважность шим в %, и неверно подсчитанную температуру.
2 - Запустить вент не пробовал, но светодиодом управляю, думаю это проблем не составит.
3 - С температурой сейчас вопрос. Я не знаю и не получается найти инфы, как из таблицы с параметрами зависимости напряжение - температура, получить переменную. Которая уже и будет обрабатываться.

Неактивний

#5 2017-05-05 19:16:13

yarikne
Учасник
З Херсон
Зареєстрований: 2017-05-04
Повідомлень: 13

Re: Управление вентилятором радиатора автомобиля, разработка.

NoName пише:

"Не понятно, что за числа в таблице..."
похоже на  linear interpolation

если хочете - научитесь )
но leonardo врядли лучшее решение для авто.

Я где-то "чувствую", что леонардо не для автомобиля, хотя и веских аргументов не вижу.
Может вы что то предложите более подходящие?

Неактивний

#6 2017-05-06 07:28:40

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 876

Re: Управление вентилятором радиатора автомобиля, разработка.

yarikne пише:

3 - С температурой сейчас вопрос. Я не знаю и не получается найти инфы, как из таблицы с параметрами зависимости напряжение - температура, получить переменную. Которая уже и будет обрабатываться.

сначала нужно выяснить что за датчик температуры, потом посмотреть его даташит, нафига таблицы строить))))

Остання редакція vvr (2017-05-06 07:29:01)

Неактивний

#7 2017-05-06 07:58:02

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Управление вентилятором радиатора автомобиля, разработка.

yarikne для температуры возьмите медь 100. PT1000 не берите, не его задача )
это удорожание проекта,  но выхода у вас особо нет.

"Я где-то "чувствую", что леонардо не для автомобиля" важное замечание - леонардо она как говорится не заточена, по хорошему берете понравившийся  контроллер из серии mcu automotive от "любимого" производителя и на нем собираете

но ардуино вам наверное ближе чем натив ... есть  и этому решение
в систему нужно добавить
1) трехсекундный watchdog 
2) супервизор по питанию
3) хороший источник питание
4) ESD diode

проверяете так  в домашних условиях так - берете шокер, и в см 5 от корпуса  держите разряд
не забудьте корпус сделать металический (профиль с эрицентра? у меня что то было но только для маленькой платы ), эго нужно будет занулить позже в авто. 

если все сделано -  пользуйтесь своей леонардо,   есть еще синяя хрень для защиты платы от пыли, влаги, вибраций, что то типа пленки, не помешает покрыть плату,  название не помню (

Неактивний

#8 2017-05-06 13:47:22

yarikne
Учасник
З Херсон
Зареєстрований: 2017-05-04
Повідомлень: 13

Re: Управление вентилятором радиатора автомобиля, разработка.

vvr пише:
yarikne пише:

3 - С температурой сейчас вопрос. Я не знаю и не получается найти инфы, как из таблицы с параметрами зависимости напряжение - температура, получить переменную. Которая уже и будет обрабатываться.

сначала нужно выяснить что за датчик температуры, потом посмотреть его даташит, нафига таблицы строить))))

Датчик температуры вот такой

Известно что при 100 градусах на нем 1,8в при 20 - 4,6в. Все классно, я думаю что градусы с него я и не буду смотреть, будем опираться на напряжение, для получение температуры я рядышком прилеплю Lm35 - с него температуру я буду выводить на экран.
Экспериментальным путем подберу напряжения при которых должен работать вентилятор.
Уже известно, что при 1,9в и ниже вентилятор должен работать на всю.

Неактивний

#9 2017-05-06 13:56:17

yarikne
Учасник
З Херсон
Зареєстрований: 2017-05-04
Повідомлень: 13

Re: Управление вентилятором радиатора автомобиля, разработка.

NoName пише:

yarikne для температуры возьмите медь 100. PT1000 не берите, не его задача )
это удорожание проекта,  но выхода у вас особо нет.

"Я где-то "чувствую", что леонардо не для автомобиля" важное замечание - леонардо она как говорится не заточена, по хорошему берете понравившийся  контроллер из серии mcu automotive от "любимого" производителя и на нем собираете

но ардуино вам наверное ближе чем натив ... есть  и этому решение
в систему нужно добавить
1) трехсекундный watchdog 
2) супервизор по питанию
3) хороший источник питание
4) ESD diode

проверяете так  в домашних условиях так - берете шокер, и в см 5 от корпуса  держите разряд
не забудьте корпус сделать металический (профиль с эрицентра? у меня что то было но только для маленькой платы ), эго нужно будет занулить позже в авто. 

если все сделано -  пользуйтесь своей леонардо,   есть еще синяя хрень для защиты платы от пыли, влаги, вибраций, что то типа пленки, не помешает покрыть плату,  название не помню (

Спасибо, хорошие советы, жаль, что производители китайского шарпотрепа для автомобилей не придержуются этих правил. (я про сигналки, блоки ДХО, навигаторы и т п)
С шокером, может и перегиб, но краш тест - должен быть жестким.
Сейчас нарыл блок управления вентиляторами от младшей модели мерседеса(он же используется в фольцвагенах). Это силовая часть с управлением на 25гц. Так сказать линия свзя работает на 25гц, а скважность регулирует обороты. 
Вот такая штука
Думаю его очень целесообразно использовать, так как там есть защиты всевозможные и шумоподавляющие фильтры.
Основной вопрос, как заставить ардуинку выдать эти заветные 25гц и еще и скажностью управлять!?!?

Неактивний

#10 2017-05-06 19:36:46

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Управление вентилятором радиатора автомобиля, разработка.

"как заставить ардуинку выдать эти заветные 25гц и еще и скажностью управлять!?!?"
это классический пример работы серво
у меня на новый год  газовый котол сдох , пришлось делать подмену датчика

в примере подключал мотор от коптера
но принцип такой же
и в серве должна быть замена   частоты, это сами разберетесь как

 
/* Encoder Library - Basic Example
 * http://www.pjrc.com/teensy/td_libs_Encoder.html
 *
 * This example code is in the public domain.
 */

//#define MAX_SIGNAL  2300
// #define NETRUAL     1400
// #define MIN_SIGNAL  400


#define MAX_SIGNAL  2000
#define NETRUAL     1500
#define MIN_SIGNAL  1000

#include <Encoder.h>
#include <Servo.h>

// Change these two numbers to the pins connected to your encoder.
//   Best Performance: both pins have interrupt capability
//   Good Performance: only the first pin has interrupt capability
//   Low Performance:  neither pin has interrupt capability
Encoder myEnc(2, 3);
//   avoid using pins with LEDs attached

Servo esc;
// int throttlePin = 0;


void setup() {
  esc.attach(9);
  esc.writeMicroseconds ( NETRUAL );
  myEnc.write           ( 50 );

  Serial.begin(9600);
  Serial.println("Start DIIV:");

}

long oldPosition  = 0xFFFF;
long newPosition;
long _PWM  = 0;

#define DEBUG


void loop() {

   long throttle = myEnc.read();
   if ( throttle   < 0      ) { throttle = 0;      myEnc.write ( throttle ); }  
   if ( throttle  > 100   )   { throttle = 100;    myEnc.write ( throttle ); }
   newPosition =  throttle;

   if ( newPosition != oldPosition) {
    oldPosition = newPosition;
    throttle = map(newPosition, 0,100, MIN_SIGNAL, MAX_SIGNAL );

    #ifdef DEBUG 
    //----------------------
    Serial.print("encoder: ");
    Serial.print(newPosition);
    //----------------------
    Serial.print(" throttle: ");
    Serial.println(throttle);
    //----------------------
    #endif
    esc.writeMicroseconds(throttle);
   //----------------------
  }
}

Неактивний

#11 2017-05-07 00:55:12

yarikne
Учасник
З Херсон
Зареєстрований: 2017-05-04
Повідомлень: 13

Re: Управление вентилятором радиатора автомобиля, разработка.

В библиотеке сервы нужно поменять частоту? Я верно понял?
Просто библиотека серво просит обратной связи. Точно мне оно подойдёт?

NoName пише:

"как заставить ардуинку выдать эти заветные 25гц и еще и скажностью управлять!?!?"
это классический пример работы серво
у меня на новый год  газовый котол сдох , пришлось делать подмену датчика

в примере подключал мотор от коптера
но принцип такой же
и в серве должна быть замена   частоты, это сами разберетесь как

 
/* Encoder Library - Basic Example
 * http://www.pjrc.com/teensy/td_libs_Encoder.html
 *
 * This example code is in the public domain.
 */

//#define MAX_SIGNAL  2300
// #define NETRUAL     1400
// #define MIN_SIGNAL  400


#define MAX_SIGNAL  2000
#define NETRUAL     1500
#define MIN_SIGNAL  1000

#include <Encoder.h>
#include <Servo.h>

// Change these two numbers to the pins connected to your encoder.
//   Best Performance: both pins have interrupt capability
//   Good Performance: only the first pin has interrupt capability
//   Low Performance:  neither pin has interrupt capability
Encoder myEnc(2, 3);
//   avoid using pins with LEDs attached

Servo esc;
// int throttlePin = 0;


void setup() {
  esc.attach(9);
  esc.writeMicroseconds ( NETRUAL );
  myEnc.write           ( 50 );

  Serial.begin(9600);
  Serial.println("Start DIIV:");

}

long oldPosition  = 0xFFFF;
long newPosition;
long _PWM  = 0;

#define DEBUG


void loop() {

   long throttle = myEnc.read();
   if ( throttle   < 0      ) { throttle = 0;      myEnc.write ( throttle ); }  
   if ( throttle  > 100   )   { throttle = 100;    myEnc.write ( throttle ); }
   newPosition =  throttle;

   if ( newPosition != oldPosition) {
    oldPosition = newPosition;
    throttle = map(newPosition, 0,100, MIN_SIGNAL, MAX_SIGNAL );

    #ifdef DEBUG 
    //----------------------
    Serial.print("encoder: ");
    Serial.print(newPosition);
    //----------------------
    Serial.print(" throttle: ");
    Serial.println(throttle);
    //----------------------
    #endif
    esc.writeMicroseconds(throttle);
   //----------------------
  }
}

Неактивний

#12 2017-05-07 06:02:35

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 876

Re: Управление вентилятором радиатора автомобиля, разработка.

а при чём серва и частота - серва управляется длительностью импульса

Неактивний

#13 2017-05-07 08:56:41

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Управление вентилятором радиатора автомобиля, разработка.

#define Servo_VERSION           2     // software version of this library

#define MIN_PULSE_WIDTH       544     // the shortest pulse sent to a servo 
#define MAX_PULSE_WIDTH      2400     // the longest pulse sent to a servo
#define DEFAULT_PULSE_WIDTH  1500     // default pulse width when servo is attached
#define REFRESH_INTERVAL    20000     // minumim time to refresh servos in microseconds

#define SERVOS_PER_TIMER       12     // the maximum number of servos controlled by one timer


1000000/REFRESH_INTERVAL
1000000/20000 = 50 Hz

я предпологаю что
#define REFRESH_INTERVAL    40000     // minumim time to refresh servos in microseconds

даст 25 Гц несущую
и возможно автор имеет в виду не частотное  управление и именно коефичиент заполнения на 25 Гц 
PWM_duty_cycle_with_label.gif
тогда  writeMicroseconds()  и будет работать

"обратная связь?"

это наверно что то совсем специальное
у меня в файле ничего такого нет
C:\Program Files (x86)\Arduino\libraries\Servo\src\Servo.h


 The methods are:

    Servo - Class for manipulating servo motors connected to Arduino pins.

    attach(pin )  - Attaches a servo motor to an i/o pin.
    attach(pin, min, max  ) - Attaches to a pin setting min and max values in microseconds
    default min is 544, max is 2400  
 
    write()     - Sets the servo angle in degrees.  (invalid angle that is valid as pulse in microseconds is treated as microseconds)
    writeMicroseconds() - Sets the servo pulse width in microseconds 
    read()      - Gets the last written servo pulse width as an angle between 0 and 180. 
    readMicroseconds()   - Gets the last written servo pulse width in microseconds. (was read_us() in first release)
    attached()  - Returns true if there is a servo attached. 
    detach()    - Stops an attached servos from pulsing its i/o pin. 
 

насчет шокера - не шучу, главное в цепи и корпус не бить а то выгорит ваша железяка.
есть вариант попроще, пьезо зажигалка 1 мм пробоя  ~ 1КB  ЭМИ   тоже есть в наличии ) тестируйте только не в цепи, а то будет "кака"


25Hz маленькая частота, можно и напрограмных  таймерах сделать.

Неактивний

#14 2017-05-07 11:04:22

yarikne
Учасник
З Херсон
Зареєстрований: 2017-05-04
Повідомлень: 13

Re: Управление вентилятором радиатора автомобиля, разработка.

Все верно, я имею ввиду скважность. На счёт обратной связи, это я перепутал, неправильно понял.
Если не сложно, кто сталкивался с серво, дайте пример программки , желательно с управлением скважностью через терминал.
И может расскажите пару слов о программных таймерах.

Неактивний

#15 2017-05-07 18:05:53

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Управление вентилятором радиатора автомобиля, разработка.

ваш вариант PWM  servo->writeMicroseconds
пример с энкодером я показал ранее.  успехов.

Неактивний

#16 2017-05-07 21:42:04

yarikne
Учасник
З Херсон
Зареєстрований: 2017-05-04
Повідомлень: 13

Re: Управление вентилятором радиатора автомобиля, разработка.

Загрузил вот такое:

/*
 Controlling a servo position using a potentiometer (variable resistor)
 by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>

 modified on 8 Nov 2013
 by Scott Fitzgerald
 http://www.arduino.cc/en/Tutorial/Knob
*/

#include <Servo.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 16, 2);

Servo myservo;  // create servo object to control a servo

int potpin = 0;  // analog pin used to connect the potentiometer
int val;    // variable to read the value from the analog pin

void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
  lcd.begin();
}

void loop() {
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
  val = map(val, 0, 1023, 0, 180);     // scale it to use it with the servo (value between 0 and 180)
  myservo.write(val);                  // sets the servo position according to the scaled value
  delay(15);                           // waits for the servo to get there

    lcd.print("TEMP: ");
    lcd.print(val); // отображение температуры
    lcd.print("C ");
    lcd.print(val); // отображение температуры
    lcd.print("V ");
    lcd.setCursor(0,1); // перевод курсора на следующую сторку
    lcd.print("FANS: ");
    lcd.print(val); // отображение скорости вращения вентилятора
    lcd.print("%");
    delay(200);
    lcd.clear();
    }

На скорую руку собрал схемку - не работает. Осцила дома нет... sad
Но понять охота - подцепил динамик параллельно выходу с транзистора - на слух частота высоковата, анализаторы в андроид приложениях показывают 800 гц, могут врать конечно...

мой Servo.h

/*
  Servo.h - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2
  Copyright (c) 2009 Michael Margolis.  All right reserved.

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

/* 
  A servo is activated by creating an instance of the Servo class passing 
  the desired pin to the attach() method.
  The servos are pulsed in the background using the value most recently 
  written using the write() method.

  Note that analogWrite of PWM on pins associated with the timer are 
  disabled when the first servo is attached.
  Timers are seized as needed in groups of 12 servos - 24 servos use two 
  timers, 48 servos will use four.
  The sequence used to sieze timers is defined in timers.h

  The methods are:

    Servo - Class for manipulating servo motors connected to Arduino pins.

    attach(pin )  - Attaches a servo motor to an i/o pin.
    attach(pin, min, max  ) - Attaches to a pin setting min and max values in microseconds
    default min is 544, max is 2400  
 
    write()     - Sets the servo angle in degrees.  (invalid angle that is valid as pulse in microseconds is treated as microseconds)
    writeMicroseconds() - Sets the servo pulse width in microseconds 
    read()      - Gets the last written servo pulse width as an angle between 0 and 180. 
    readMicroseconds()   - Gets the last written servo pulse width in microseconds. (was read_us() in first release)
    attached()  - Returns true if there is a servo attached. 
    detach()    - Stops an attached servos from pulsing its i/o pin. 
 */

#ifndef Servo_h
#define Servo_h

#include <inttypes.h>

/* 
 * Defines for 16 bit timers used with  Servo library 
 *
 * If _useTimerX is defined then TimerX is a 16 bit timer on the current board
 * timer16_Sequence_t enumerates the sequence that the timers should be allocated
 * _Nbr_16timers indicates how many 16 bit timers are available.
 */

// Architecture specific include
#if defined(ARDUINO_ARCH_AVR)
#include "avr/ServoTimers.h"
#elif defined(ARDUINO_ARCH_SAM)
#include "sam/ServoTimers.h"
#elif defined(ARDUINO_ARCH_SAMD)
#include "samd/ServoTimers.h"
#else
#error "This library only supports boards with an AVR, SAM or SAMD processor."
#endif

#define Servo_VERSION           2     // software version of this library

#define MIN_PULSE_WIDTH       544     // the shortest pulse sent to a servo  
#define MAX_PULSE_WIDTH      2400     // the longest pulse sent to a servo 
#define DEFAULT_PULSE_WIDTH  1500     // default pulse width when servo is attached
#define REFRESH_INTERVAL    40000     // minumim time to refresh servos in microseconds 

#define SERVOS_PER_TIMER       12     // the maximum number of servos controlled by one timer 
#define MAX_SERVOS   (_Nbr_16timers  * SERVOS_PER_TIMER)

#define INVALID_SERVO         255     // flag indicating an invalid servo index

typedef struct  {
  uint8_t nbr        :6 ;             // a pin number from 0 to 63
  uint8_t isActive   :1 ;             // true if this channel is enabled, pin not pulsed if false 
} ServoPin_t   ;  

typedef struct {
  ServoPin_t Pin;
  volatile unsigned int ticks;
} servo_t;

class Servo
{
public:
  Servo();
  uint8_t attach(int pin);           // attach the given pin to the next free channel, sets pinMode, returns channel number or 0 if failure
  uint8_t attach(int pin, int min, int max); // as above but also sets min and max values for writes. 
  void detach();
  void write(int value);             // if value is < 200 its treated as an angle, otherwise as pulse width in microseconds 
  void writeMicroseconds(int value); // Write pulse width in microseconds 
  int read();                        // returns current pulse width as an angle between 0 and 180 degrees
  int readMicroseconds();            // returns current pulse width in microseconds for this servo (was read_us() in first release)
  bool attached();                   // return true if this servo is attached, otherwise false 
private:
   uint8_t servoIndex;               // index into the channel data for this servo
   int8_t min;                       // minimum is this value times 4 added to MIN_PULSE_WIDTH    
   int8_t max;                       // maximum is this value times 4 added to MAX_PULSE_WIDTH   
};

#endif

во вложении фотка осциллограммы, это то, что хотелось бы получить.
И фотки процесса )))

намерил подручными средствами 138гц

вернул в зад #define REFRESH_INTERVAL    20000 - получил 50гц

Остання редакція yarikne (2017-05-07 22:17:07)

Неактивний

#17 2017-05-08 09:21:57

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Управление вентилятором радиатора автомобиля, разработка.

потолок 0xFFFF 32768  )  это ведь логично мы ведь о 8 битнике говорим, забылся
нужно найти делитель таймера и тогда сможете пользоваться

Неактивний

#18 2017-05-08 09:27:53

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Управление вентилятором радиатора автомобиля, разработка.

по даташиту  сами проверите, правил   servo.cpp на уровне догадок

old PRESCALER 8

static void InitISR_handler()
{
    __disable_irq();

    NRF_TIMER1->TASKS_STOP = 1;
    NRF_TIMER1->MODE = TIMER_MODE_MODE_Timer;
    NRF_TIMER1->PRESCALER = 3;
    NRF_TIMER1->BITMODE = TIMER_BITMODE_BITMODE_16Bit;
    NRF_TIMER1->TASKS_CLEAR = 1;
    NRF_TIMER1->CC[0] = (uint32_t)(VARIANT_MCK/8/1000); // 1ms
    NRF_TIMER1->EVENTS_COMPARE[0] = 0;
    NRF_TIMER1->INTENSET = (TIMER_INTENSET_COMPARE0_Set << TIMER_INTENSET_COMPARE0_Pos);

    NVIC_SetPriority(TIMER1_IRQn, 1);
    NVIC_EnableIRQ(TIMER1_IRQn);

    __enable_irq();
    NRF_TIMER1->TASKS_START = 1;
}


new  old PRESCALER 16?

#define usToTicks(_us)    (( clockCyclesPerMicrosecond()* _us) / 16)               // converts microseconds to tick (assumes prescale of 8)  // 12 Aug 2009
#define ticksToUs(_ticks) (( (unsigned)_ticks * 16)/ clockCyclesPerMicrosecond() ) // converts from ticks back to microseconds

static void InitISR_handler()
{
    __disable_irq();

    NRF_TIMER1->TASKS_STOP = 1;
    NRF_TIMER1->MODE = TIMER_MODE_MODE_Timer;
    NRF_TIMER1->PRESCALER = 4;
    NRF_TIMER1->BITMODE = TIMER_BITMODE_BITMODE_16Bit;
    NRF_TIMER1->TASKS_CLEAR = 1;
    NRF_TIMER1->CC[0] = (uint32_t)(VARIANT_MCK/16/1000); // 1ms
    NRF_TIMER1->EVENTS_COMPARE[0] = 0;
    NRF_TIMER1->INTENSET = (TIMER_INTENSET_COMPARE0_Set << TIMER_INTENSET_COMPARE0_Pos);

    NVIC_SetPriority(TIMER1_IRQn, 1);
    NVIC_EnableIRQ(TIMER1_IRQn);

    __enable_irq();
    NRF_TIMER1->TASKS_START = 1;
}

Неактивний

#19 2017-05-08 10:43:42

yarikne
Учасник
З Херсон
Зареєстрований: 2017-05-04
Повідомлень: 13

Re: Управление вентилятором радиатора автомобиля, разработка.

... ничего не понял, даташит от чего? Что именно правилось?
Прошу прощения, но я пока очень далек от программирования пока. Если не сложно, можно чуток доходчивые, подробнее.

Неактивний

#20 2017-05-08 11:40:01

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Управление вентилятором радиатора автомобиля, разработка.

http://www.atmel.com/Images/Atmel-7766-8-bit-AVR-ATmega16U4-32U4_Datasheet.pdf
меня к сожалению пробивает поменторствовать, старею )
но сегодня не тот вариант

самым быстрым решением - сделать вам код, но фришные решение никогда не доводятся до ума, я не могу быть личным консультантом 

для Вас есть вариант - заказать этот несложный   проект  у ребят
http://forum.arduino.ua/viewtopic.php?id=1069


либо помочь Пете )
у меня племмяник нынче на химии  в Минске, денег эти процедуры тянут немеренно, стране нынче не до этих малышей ( это жесть как их много ((( ), потому люд подлючаю не байдужий.  Сложно боротся когда нужно думать чем оплатить транш  в Пт когда на счетах 10% от счета ( но эт дело такое...

просто поделитесь если совсем туго
группа  https://www.facebook.com/groups/594145280779388/

я вечером сделаю прототип, 25 Гц регулировка энкодером и терминалкой
какая нужна точность установки ?   в  абсолютных  % , никаких относительных и дополнительных погрешностей.

Неактивний

#21 2017-05-08 14:53:02

yarikne
Учасник
З Херсон
Зареєстрований: 2017-05-04
Повідомлень: 13

Re: Управление вентилятором радиатора автомобиля, разработка.

Поделюсь и помогу Пете с удовольствием.

На счет точности установки скважности и частоты не знаю, нужно эксперементировать.

Думаю, что 5 ступенек скважности будет достаточно, 30% 50% 60% 80 и 90 (100 - не ставим, это аварийный режим, типа короткое замыкание управляющей линии на +  или -).
Было-бы неплохо не энкодер, он не к чему, а напряжение на А0 соответствующие диапазонам.
от 5в до-2,1в - 10% (вентилятор выключен, если их нет, то он аварийно включается)
2в -30%;
от 2в до 1,95в-50%;
1,96в-1,90в - 60%;
1,89в-1,84в -80%;
и ниже 1,84в пусть гудит на всю, 90%.
Ну и еще нужно 2 цифровых входа, при подаче на один + вентилятор должен включаться на 50% при любых условиях, а второй на 90% - Это для работы кондиционера.

Это все цифры с головы, я какое-то время ездил с 16*2 возле спидометра и наблюдал за напряжением на датчике температуры.

Остання редакція yarikne (2017-05-08 15:19:30)

Неактивний

#22 2017-05-08 15:36:04

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Управление вентилятором радиатора автомобиля, разработка.

благодарю
2 кнопки найду  )

поищу  регулируемый источник
но есть вопрос
как подключался датчик,  как напряжение смотрели?  и какая схема включение? кто то еще пользуется с електроники авто этим датчиком?

Неактивний

#23 2017-05-08 19:08:01

yarikne
Учасник
З Херсон
Зареєстрований: 2017-05-04
Повідомлень: 13

Re: Управление вентилятором радиатора автомобиля, разработка.

Не пойму зачем регулируемый источник? Для имитации можно взять любой подстроечник, я использую 10к. Средняя нога выход крайние питание.
Датчик - термистор, подключенный как плечо делителя напряжения, вторая половина плеча в ЭБУ. Физически расположен на корпусе термостата, на выходе из него. На датчик приходит масса ЭБУ и "подтяжка 5 вольт". Напряжения снимальсь ардуинкой:
  int sensorValue = analogRead(A0);
  // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
  float voltage = sensorValue * (5.0 / 1023.0);
  // print out the value you read:
  Serial.println(voltage);
типа так.
Всего на двигателе 3 датчика температуры, один на ЭБУ двигателя, второй на ЭБУ клмат контроля и третий на стрелку в панеле приборов. Я тупанул и подключился к датчику климата, не знаю на сколько это кретично, но на многих авто, вентилятором охлаждения ОЖ управляет именно климат.
Можно конечно и собрать новые данные, нужно подумать.

Неактивний

#24 2017-05-08 22:36:06

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: Управление вентилятором радиатора автомобиля, разработка.

"подстроечник"  нету  )
есть сотня  0805  резисторов, но на них неудобно  делители набивать.

Вы забыли указать какие значения  при авариной работе . например нет напруги,  и на момент старта.

25 Гц сделал

#define INTERVAL_SIGNAL  40000
#define MAX_SIGNAL  36000
#define NETRUAL     20000
#define MIN_SIGNAL  4000

какие номера ног вы под кнопки выбрали?
по кнопкам
пока кнопка нажата ( + уровень ) устанавливает пресет по скорости вращения,
я бы вам рекомендовал плавную регулировку  смены  скважности

мыло ваше активно? код пришлю

Неактивний

#25 2017-05-08 22:42:49

yarikne
Учасник
З Херсон
Зареєстрований: 2017-05-04
Повідомлень: 13

Re: Управление вентилятором радиатора автомобиля, разработка.

Мыло активно, ноги, какие вам удобно.
По кнопкам все верно.
Аварийная работа 95% Скважность
Блок управления силовой, сам плавно все делает, тем более вентиляторы довольно инерционны.

Остання редакція yarikne (2017-05-08 22:44:26)

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму