помогите соединить коды
- Войдите на сайт для отправки комментариев
Сб, 16/05/2015 - 00:18
Есть два кода: частотомер и ЦАП на основе шим порта, оба проверены рабочие. Сам слаб в программировании, но очень надо. Задача такая: результат измерений частотомера должен управлять ШИМ выходом. Зависимость следующая: измеренной частоте от 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");
}
tachValue = 250000/tachBuf; analogWrite(6, constrain(map(tachValue, 0, 600, 0, 255), 0, 255)); //Запустить ШИМ на 6 выводе (на 9 работать не будет) Serial.print("freq=");Максим, спасибо! Все проверил, работает.