помогите соединить коды

Анатолий439781k
Offline
Зарегистрирован: 13.01.2015

Есть два кода: частотомер и ЦАП на основе шим порта, оба проверены рабочие. Сам слаб в программировании, но очень надо. Задача такая: результат измерений частотомера должен управлять ШИМ выходом. Зависимость следующая: измеренной частоте от 0 до 600 Гц должны соответствовать уровни от 0 до 255 на входе нашего ЦАПа, и соответственно напряжение от 0 до 5 В на нашем ШИМ выходе. В коде входом ЦАПа является монитор порта. Может как-то убрать лишние операции, чтобы ЦАП сразу выдавал соответствие частоте. Если можно прокомментируйте строки. Раскатал губу:))))))). Помогите, кому не безразличны потуги школоты.

Вот коды:

частотомер

#include <util/delay.h> 
 
 volatile unsigned int tachBuf; 
unsigned long tachValue; 
 
 ISR(TIMER1_CAPT_vect) 
{   
    TCNT1 = 0;   
    tachBuf = ICR1+2; 
} 
//******************************************************************** 
void setup()     
{   
  pinMode(8, INPUT);  //Вход для импульсов спидометра 
  pinMode(6, OUTPUT);//выход ШИМ 
  TCCR0B = TCCR0B & 0b11111000 | 5;//частота ШИМ   
  analogWrite(6, 128);  //Запустить ШИМ 
  digitalWrite(8, HIGH); // включить подтяжку входа 
  Serial.begin(115200); 
  TIM_Init();//инициализация таймера 
  _delay_ms(300); 
}   
//******************************************************************** 
void loop()     
{ 
  cli();   
  tachValue =250000/tachBuf; 
  Serial.print("freq="); 
  Serial.println(tachValue,DEC); 
  tachBuf=1; 
  sei(); 
  _delay_ms(300); 
}     
//******************************************************************** 
void TIM_Init(void) 
{ 
  TIMSK1=(1<<ICIE1);   
  TCCR1A=(0<<COM1A1)|(0<<COM1A0)|(0<<WGM11)|(0<<WGM10);   
  TCCR1B=(1<<ICNC1)|(1<<ICES1)|(0<<WGM13)|(0<<WGM12)|(0<<CS12)|(1<<CS11)|(1<<CS10); 
  TCNT1 = 0;                                             
}  

ЦАП на основе шим порта

// ЦАП
 char buffer[18];
 int pinPWM = 9;
 int raw = 0;
 float Volt = 0;
  
 void setup()
 {
   Serial.begin(9600);
   Serial.println("DAC mit PWM-Ausgang");
   Serial.println();
   Serial.println("Geben Sie einen Wert zwischen 0 und 255 ein");
   Serial.flush();
 }
  
 void loop()
 {
   if (Serial.available() > 0)
   {
     int index = 0;
     delay(100); // ожидание символов в буфере
     int numChar = Serial.available();
     if (numChar > 15)
     {
       numChar = 15;
     }
     while (numChar--)
     {
       buffer[index++] = Serial.read();
     }
     splitString (buffer);
   }
 }
  
 void splitString(char* data)//36
  
 {
   Serial .print ("Empfangen wurde der Wert: ") ;
   Serial.println(data);
   char* parameter;
   parameter = strtok (data, " ,");
   while (parameter != NULL)
   {
     setPWM (parameter) ;
     parameter = strtok (NULL, " ,");
   }
   // Снова очистка буфера
   for (int x = 0; x < 16; x++)
   {
 buffer[x]='\0';
   }
   Serial.flush();
 }
  
 void setPWM(char* data)
 {
   int Ans = strtol(data, NULL, 10);
   Ans = constrain(Ans, 0, 255);
   analogWrite(pinPWM, Ans);
   Serial.print("PWM = ");
   Serial.println(Ans);
   delay(100);
   raw = analogRead(0);
   float ref = 5.0 / 1024.0;
   Volt = raw * ref;
   Serial.print("Die Spannung am ADC0 betraegt: ");
   Serial.print(Volt);
   Serial.println(" Volt");
   Serial.println();
   Serial.println("Geben Sie einen Wert zwischen 0 und 255 ein");
 }

 

maksim
Offline
Зарегистрирован: 12.02.2012
tachValue = 250000/tachBuf; 
analogWrite(6, constrain(map(tachValue, 0, 600, 0, 255), 0, 255));  //Запустить ШИМ на 6 выводе (на 9 работать не будет)
Serial.print("freq=");

 

Анатолий439781k
Offline
Зарегистрирован: 13.01.2015

Максим, спасибо! Все проверил, работает.