здравствуйте, пишу первый раз на этом форуме, и прошу прощения если не в той теме. так вот, разрабатываю устройство которое должно принимать на ацп синусоиду, считывать ее угол, а затем на основе формул высчитать еще 6 углов и выдать на аналоговые выводы. одновременно должна и вращать шд. если нужна схема, то могу набросать. так вот в чем собственно пробленма, запускал на эмуляторах - отказывается работать. Можете подсказать что не так, просто очень опасно если готовую плату подсоеденить туда где будет работать. Спасибо за помощь вот собственно скетч int inPin = A5; // select the input pin for the potentiometer int ledPin = 13; // select the pin for the LED int inValue = 0; volatile float alfa_grad = 0; float alfa_rad = 0; byte modul; byte modul_1; byte modul_2; byte modul_3; byte modul_4; byte modul_5; void setup() { // declare the Pin as an OUTPUT: pinMode(3, OUTPUT); pinMode(A5, INPUT); Serial.begin(115200); // connect to the serial port Serial.println("PWM Test"); TCCR1A = 0; TCCR1B = 0; TCNT1 = 0; OCR1A = 312.5; TCCR1B |= (1 << WGM12); TCCR1B |= (1 << CS10); TCCR1B |= (0 << CS11); TCCR1B |= (1 << CS12); TIMSK1 |= (1 << OCIE1A); // Разрешить прерывание по совпадению } ISR(TIMER1_COMPA_vect){ alfa_grad += 0.36; if(alfa_grad > 359 && alfa_grad < 361) { alfa_grad = 0; } } void loop() { alfa_rad = (float)alfa_grad*3.14/180; inValue = map (analogRead(inPin),0,1023,0,255) - 127; modul = map (((float)inValue*sin(alfa_rad))*100,-12700,12700,-127,127) + 127; modul_1 = map (((float)inValue*sin(alfa_rad + 2.09))*100,-12700,12700,-127,127) + 127; modul_2 = map (((float)inValue*sin(alfa_rad + 4.18))*100,-12700,12700,-127,127) + 127; analogWrite (3,modul); analogWrite (5,modul_1); analogWrite (6,modul_2); volatile float alfa = alfa_rad; if (alfa >= 6.2832) { do {alfa = alfa - 6.2832;} while (alfa < 6.2832); } modul_3 = map(((float)inValue*sin(alfa))*100,-12700,12700,-127,127) + 127; modul_4 = map (((float)inValue*sin(alfa + 2.09))*100,-12700,12700,-127,127) + 127; modul_5 = map (((float)inValue*sin(alfa + 4.18))*100,-12700,12700,-127,127) + 127; analogWrite (9,modul_3); analogWrite (10,modul_4); analogWrite (11,modul_5); // if ((int)alfa_grad % 15) { подача на на двигатель для одного шага //} }
Когда это у AVR появились вещественные регистры? modul* - это byte, map принимает long int, а вы все делаете во float. Где приведение типов?
если можно, то скажите как привести в данном случае типы. но как я понял за это будет отвечать -12700,12700,-127,127 преобразуя размерности, или я не прав
Нет, не правы, преобразование значения переменной и преобразование типа переменной это совершенно разные действия. Функция map() вам тоже не очень подходит, т.к. она внутри она выполняет целочисленное деление и тем самым генерирует большие ошибки округления. Вам нужна аналогичная функция для вещественных чисел Код (Text): float fmap(float x, float in_min, float in_max, float out_min, float out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; } Общий принцип такой - считаем в вещественных числах, округляем только конечный результат. Код (Text): long int ftoi(float x) { if (x>=0.0) return (long int)floor(x+0.5); else return (long int)ceil(x-0.5); }
включил в силовую и делюсь наблюдением. Так вот на выводах 3, 5, 6, 11 сигнал есть. а на выводах 9 и 10 аналоговые отсуствуют. скетч не менял, но в чем проблема. почему 9 и 10 нет сигналов? кто подскажет?