прошу помощи

Тема в разделе "Arduino & Shields", создана пользователем kamens4ik, 29 ноя 2014.

  1. kamens4ik

    kamens4ik Нуб

    здравствуйте, пишу первый раз на этом форуме, и прошу прощения если не в той теме. так вот, разрабатываю устройство которое должно принимать на ацп синусоиду, считывать ее угол, а затем на основе формул высчитать еще 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) { подача на на двигатель для одного шага


    //}









    }
     
  2. Unixon

    Unixon Оракул Модератор

    :confused:
    Когда это у AVR появились вещественные регистры?

    modul* - это byte, map принимает long int, а вы все делаете во float.
    Где приведение типов?
     
  3. kamens4ik

    kamens4ik Нуб

    если можно, то скажите как привести в данном случае типы. но как я понял за это будет отвечать -12700,12700,-127,127 преобразуя размерности, или я не прав
     
  4. Unixon

    Unixon Оракул Модератор

    Нет, не правы, преобразование значения переменной и преобразование типа переменной это совершенно разные действия. Функция 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);
    }
     
     
  5. kamens4ik

    kamens4ik Нуб

    включил в силовую и делюсь наблюдением. Так вот на выводах 3, 5, 6, 11 сигнал есть. а на выводах 9 и 10 аналоговые отсуствуют. скетч не менял, но в чем проблема. почему 9 и 10 нет сигналов? кто подскажет?