помогите соединить коды
- Войдите на сайт для отправки комментариев
Сб, 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"); }
Максим, спасибо! Все проверил, работает.