avatar_AndreyA

Индикатор тока для настройки Infineonа на коленке (Ардуино и быдлокод).

Автор AndreyA, 28 Июнь 2018 в 14:30

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

AndreyA

Будет необходимость прогонять контроллер с новым велом(поеду нескоро). Залез в настройки, также в самом контроллере поменял термопрокладки на рукав для запекания, установил термодатчики на пластине внутри и корпусе. Сделал простой усилитель  сигнала со стандартного разъёма Infineonа 12 фет на операционном усилителе. Опорное напряжение с отдельного стабилизатора tl431. Также измеряется температура датчиков NTC 1000, какие были в наличии и сигнал скорости. Индикатор из наличия через HC 595 МТ-10Т8, китайские все погорели. Среда Ардуино 1.0.5. Пока всё на коленке, да и для теста много не нужно- выкладываю от скуки..

Спойлер

// which analog pin to connect
#define THERMISTORPIN A1         
// resistance at 25 degrees C
#define THERMISTORNOMINAL 100000     
// temp. for nominal resistance (almost always 25 C)
#define TEMPERATURENOMINAL 25   
// how many samples to take and average, more takes longer
// but is more 'smooth'
#define NUMSAMPLES 5
// The beta coefficient of the thermistor (usually 3000-4000)
#define BCOEFFICIENT 4036
// the value of the 'other' resistor
#define SERIESRESISTOR 100000   

// Датчик тока контроллера
#define Current A6   

// Датчик напряжения батареи
#define Voltage A0 
// Датчик напряжения батареи
#define External_voltage 500
#define Current_span 100;
#define Voltage_span 100;
#define Max_voltage 100;
#define Max_current 100;
uint16_t samples[NUMSAMPLES];

#define OA0 7;
#define OWR1 5;
//Пин подключен к ST_CP входу 74HC595
int latchPin = 4;
//Пин подключен к SH_CP входу 74HC595
int clockPin = 3;
//Пин подключен к DS входу 74HC595
int dataPin = 8;
byte Data;
int tempr (byte THERMISTORPIN1);
int ref=0;
unsigned long lastUpdate;
float total;
int Speed;
int SpeedCount;
// Подпрограммы для индикатора
void Set_mode(){
  Data=B00000010;//
  TransferD(Data);
}
void Set_adres(){
  Data=B00000000;//
  TransferA(Data);
}

void Transfer(byte Send)
{
  int cou=9;
  byte i=0;
  while (cou>1) {
    cou--;
    if (bitRead(Send, 7)==1) {
      digitalWrite (dataPin,1);
      do {
        i++;
      }
      while (i<30);
      i=0;
      digitalWrite (clockPin,1);
      do {
        i++;
      }
      while (i<30);
      i=0;
      digitalWrite (clockPin,0);
      do {
        i++;
      }
      while (i<30);
      i=0;
    }
    else {
      digitalWrite (dataPin,0);
      do {
        i++;
      }
      while (i<30);
      i=0;
      digitalWrite (clockPin,1);
      do {
        i++;
      }
      while (i<30);
      i=0;
      digitalWrite (clockPin,0);
      do {
        i++;
      }
      while (i<30);
      i=0;
    }
    Send=Send <<1;
  } 
  digitalWrite (latchPin,1);
  do {
    i++;
  }
  while (i<30);
  i=0;
  digitalWrite (latchPin,0);
  do {
    i++;
  }
  while (i<30);
  i=0;

}

byte TransferA(byte DataD)
{
  bitClear(DataD,7);
  Transfer(DataD);
  bitSet(DataD,5);
  Transfer(DataD);

  bitClear(DataD,5);
  Transfer(DataD);
  bitSet(DataD,7);
  Transfer(DataD);
};
byte TransferD(byte DataA)
{
  bitSet(DataA,7);
  bitClear(DataA,5);
  Transfer(DataA);
  bitSet(DataA,5);
  Transfer(DataA);
  bitClear(DataA,5);
  Transfer(DataA);
};

void SrtPrint (char string[])
{
  byte DIGIT;
  byte i=0;
  byte LD;
  byte HD;
  while (string[i]){
    DIGIT=string[i]-'0';
    Serial.write(DIGIT);
    LD=0;HD=0;
    switch (DIGIT){

    case 0:
      LD=0b00001110;
      HD=0b00001110;
      ;
      break;
    case 1:
      LD=0b00000000;
      HD=0b00000110;
      break;
    case 2:
      LD=0b00001111;
      HD=0b00000010;
      break;
    case 3:
      LD=0b00001101;
      HD=0b00000110;
      break;
    case 4:
      LD=0b00000001;
      HD=0b00001110;
      break;
    case 5:
      LD=0b00001101;
      HD=0b00001100;
      break;
    case 6:
      LD=0b00001111;
      HD=0b00001100;
      break;
    case 7:
      LD=0b00001000;
      HD=0b00000110;
      break;
    case 8:
      LD=0b00001111;
      HD=0b00001110;
      break;
    case 9:
      LD=0b00001101;
      HD=0b00001110;
      break;
        case (65-48):
      LD=0b00001011;
      HD=0b00001110;
      break;
        case (66-48):
      LD=0b00000110;
      HD=0b00001110;
      break;
    }
    i++;
    TransferD(LD<<1);
    TransferD(HD<<1);
  }
}


void refresh() {
  // отсчитываем от 0 до 255  и отображаем значение на светодиоде
  char* screen[1]={"666666666" };
   uint8_t i;
    float average;
  float average1;
 
 


    // take N samples in a row, with a slight delay
    for (i=0; i< NUMSAMPLES; i++) {
      samples[i] = analogRead(THERMISTORPIN);
     
    }

    // average all the samples out
    average = 0;
    for (i=0; i< NUMSAMPLES; i++) {
      average += samples[i];
    }
    average /= NUMSAMPLES;

    Serial.print("Average analog reading ");
    Serial.println(average);

    // convert the value to resistance
    average = 1023 / average - 1;
    average = SERIESRESISTOR / average;
    Serial.print("Thermistor resistance ");
    Serial.println(average);

    float steinhart;
    steinhart = average / THERMISTORNOMINAL;     // (R/Ro)
    steinhart = log(steinhart);                  // ln(R/Ro)
    steinhart /= BCOEFFICIENT;                   // 1/B * ln(R/Ro)
    steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)
    steinhart = 1.0 / steinhart;                 // Invert
    steinhart -= 273.15;                         // convert to C

    Serial.print("Temperature ");
    Serial.print(steinhart);
    Serial.println(" *C");
    average=analogRead(Current);
    average = average/1023;
    average = average *External_voltage/500*Current_span;
    Serial.print("Current ");
    Serial.print(average);
    Serial.println(" *A");


Set_adres();
    TransferA(Data);
    dtostrf(average, 2, 0, screen[0]);
    screen[0]=screen[0];
    Set_adres();
    SrtPrint(screen[0]);
    SrtPrint("A");
Serial.print(screen[0]);
average1=analogRead(Voltage);
average1 = average1/1023;
    average1 = average1 *External_voltage/500*Voltage_span;
dtostrf(average1, 2, 0, screen[0]);
  SrtPrint(screen[0]);
  SrtPrint("B");
total=total+(average*average1)/3600;
total=SpeedCount*72/230;
dtostrf(total, 4, 0, screen[0]);
 
  SrtPrint(screen[0]);

 
}
// Прерывание раз в секунду
ISR(TIMER0_COMPA_vect)
{
unsigned long currentMillis = millis();

if((currentMillis - lastUpdate) > 1000) // пришло время обновляться
  { lastUpdate=currentMillis;
    ref=1; SpeedCount=Speed;Speed=0;
  } else {ref=0;}
if(currentMillis<lastUpdate) {lastUpdate=currentMillis;}
}

// Прерывание по сигналу датчика скорости
void countSpeed(){
Speed=Speed+1;}

void setup() {

  //устанавливаем режим OUTPUT
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(7, INPUT);
  analogReference(EXTERNAL);
  // Включение прерывания по сигналу датчика скорости
  attachInterrupt(0, countSpeed, RISING);
 
  Serial.begin(9600);
    Set_mode(); Set_adres();
 
 
// Настройка для прерываний раз в секунду
   OCR0A = 128;
TIMSK0 |= _BV(OCIE0A);
sei();//allow interrupts
}

void loop() {
  int i=1; int i1=1;
while (i==1) {
if(ref==1) {
refresh();}
   while (i1<20000){
i1=i1+1;
}i1=1;
};
}
MXUS 3k Рама Horizon. котлеты 20
s6p.