Выплескивание эмоций

Тема в разделе "Флудилка", создана пользователем alp69, 15 окт 2016.

  1. akl

    akl Гуру

    подумал тут - мне ведь не столько нужны библиотеки, сколько скорее примеры хороших реализаций различных полезных штук, которые можно вставить в свой скетч (при этом возможно даже разобравшись как оно работает). А библиотеки в качестве подобных примеров обычно не очень удобны, т.к. в них всё запутано ради универсальности. Но вот нашел и довольно читаемые библиотеки, даже с русскими комментариями. http://www.avrki.ru/articles/content/axlib/index.php?id=6#START Хотя это тоже создано энтузиастом и неизвестно насколько хорошо работает.
     
  2. Airbus

    Airbus Радиохулиган Модератор

    Попробуйте Кодвижн CV AVR только версии 2.05 она более функциональная.Там есть свои библиотеки и Мастер кода который помогает избежать ошибок.Проекты Кодвижн (.cvp)можно отлаживать в симуляторе Студии.Можно написать любой код практически под любое устройство.Прошить по ISP можно тоже сразу из CVAVR как гриться "не вынимая"
     
  3. akl

    akl Гуру

    на первый взгляд выглядит как-то геморно. И еще придется бегать искать кряки для этого кодвижна.
     
  4. Airbus

    Airbus Радиохулиган Модератор

    Кряки там же обычно в архиве.Отладка ничем не отличается от студийной.
     
  5. Igor68

    Igor68 Гуру

    А Вот измерять ток придётся все-таки через операционник...
     
  6. akl

    akl Гуру

    не факт что усилитель поможет. Если это погрешности не от атмеговского АЦП, а от самого датчика (что скорее всего, т.к. очень уж сильно дрейф нуля зависит от температуры), то толку не будет.
     
  7. Igor68

    Igor68 Гуру

    Вы про дрейф нуля как я понимаю... так посмотрите в сторону Analog Devices. Да и обратную связь никто не отменял... Вот посмотрите:AD8551_8552_8554.pdf
     

    Вложения:

  8. akl

    akl Гуру

    надо будет попробовать. но попозже. а то только начал со студией и сразу кидаться на другую. Да и не особо мне сейчас нужны какие-то экзотические библиотеки, а какие-то более-менее стандартные и для студии вроде есть, можно их даже не использовать, а просто выколупывать из них что надо. после того как "портировал" ардуиновскую библиотеку серво, это уже не пугает.

    честно говоря совсем не понял что можно сделать с дрейфом нуля. Если например при 20 градусах этот датчик ACS712 выдает допустим 2,5 вольта при нуле амперов, а если его прогреть под током градусов до 50, то сразу после этого при опять нулевом токе он уже выдает допустим 2,48 вольт. Затем все это остывает и 2,5 возвращается.
    не понимаю какую можно тут обратную связь ввести, разве что от температуры, но это уже слишком жестко будет, проще там кренку вынести на проводах куда-нибудь наружу вместе с радиатором, чтоб она ничего не нагревала.

    Возможно попробую просто усилитель поставить, в конце концов не факт что вся эта погрешность обусловлена одним только датчиком.

    типа такого например запилить

    [​IMG]

    а лучше два оу использовать, чтоб обратно инвертировать чтоб не задом наперед было. все равно их два в корпусе.
     
    Последнее редактирование: 27 окт 2017
  9. Igor68

    Igor68 Гуру

    Я про датчик ничего не говорил... Вам потребуется шунт нормальный и схема на операционниках. Дрейф нуля у упомянутых ОУ единицы микровольт на градус, а манганиновый шунт это тоже стабильность. Вы я так понимаю используете АЦП контроллера... так при чём тут библиотеки я не знаю.
     
    akl нравится это.
  10. akl

    akl Гуру

    а я то как раз про датчик. это у него ноль (и вообще все показания) смещаются вниз пропорционально температуре. Причем значительно сильнее, чем написано в даташите. хз, может на АЦП температура тоже как-то влияет.

    библиотеки тут вообще не при чем, то есть они отдельно обсуждаются сами по себе как таковые.
     
  11. akl

    akl Гуру

    аа, кажется понял, вы предлагаете вообще выкинуть датчик и использовать шунт вместо него. Это тоже можно попробовать в принципе
     
  12. akl

    akl Гуру

    воспользовался мудрым советом и запилил такой модуль из сопротивления 0,24ом и LM358

    [​IMG]

    в результате индикация работает отлично, не то что с тем тупым датчиком холла

    немного причесал скетч. теперь можно калибровать ток при котором загорается первая зеленая лампочка в полоске, и ток при котором загорается вторая (а с разницей между второй и первой загораются все последующие), то есть можно настраивать индикацию на разный ток без перепрошивки.
    Код (C++):
    #include <avr/io.h>
    #define F_CPU 8000000UL
    #include <util/delay.h>

    #define setH(port,bit)  do{port |= (1 << bit);}while(0)
    #define setL(port,bit)  do{port &= ~(1 << bit);}while(0)
    #define readP(reg,bit)    (reg & (1 << bit))

    uint16_t tok;
    uint8_t tokmod;
    uint8_t tokmodd;
    uint16_t tok0;
    uint8_t tokd;
    uint8_t button;
    uint8_t caltok;
    uint8_t caltok1;
    uint8_t calbut;
    uint8_t calmod;

    typedef struct pin_t
    {
        volatile uint8_t *port;
        uint8_t bit;
    }Pin;

    Pin Led0 = {&PORTD, 1<<5};
    Pin Led1 = {&PORTD, 1<<6};
    Pin Led2 = {&PORTD, 1<<7};
    Pin Led3 = {&PORTB, 1<<0};
    Pin Led4 = {&PORTB, 1<<1};
    Pin Led5 = {&PORTB, 1<<2};

    Pin* LedArray[] = {
    &Led0,
    &Led1,
    &Led2,
    &Led3,
    &Led4,
    &Led5
    };
    #define allleds 6


    void WriteLed_on(uint8_t num)
    {
      Pin* pin = LedArray[num];
      *pin->port |= pin->bit;
    }

    void WriteLed_off(uint8_t num)
    {
      Pin* pin = LedArray[num];
      *pin->port &= ~pin->bit;
    }


    void SetLeds(uint8_t n){
       uint8_t i;
       for(i=0; i<allleds; i++){
       if(i<n){WriteLed_on(i);}
       else{WriteLed_off(i);}}
    }

    static inline uint16_t AdcRead(uint8_t analog_pin){  //ADC
        ADMUX = 0b01000000 | analog_pin; //VCC
        ADCSRA = 0b11000110; // СК/64 (125KHZ)
        while ((ADCSRA & (1 << ADIF)) == 0);
        uint16_t adcw;
        adcw= ADC;
        ADCSRA |= (1 << ADIF);
        return adcw;
    }

    void EepromWrite(uint16_t addr, uint8_t dat){
       while(EECR & (1<<EEWE));
       EEAR = addr;
       EEDR = dat;
       EECR |= (1<<EEMWE);
       EECR |= (1<<EEWE);
    }

    uint8_t EepromRead(uint8_t addr){
       while(EECR & (1<<EEWE));
       EEAR = addr;
       EECR |= (1<<EERE);
       return EEDR;
    }

    void calibrovka(){
       uint8_t tokk;
       tokk = tok;
       int8_t i;
       WriteLed_off(0);
       WriteLed_off(1);
       WriteLed_off(2);
       WriteLed_off(3);
       WriteLed_off(4);
       if(calmod==0){
         EepromWrite(120, 123);
         _delay_ms(50);
         EepromWrite(121, tokk);
         caltok = tokk;
         tok0 = caltok;
         calmod=1;
         _delay_ms(200);
         for(i=0; i<(allleds-1); i++){
           WriteLed_on(i);
           _delay_ms(200);
           WriteLed_off(i);}}
       else{
          EepromWrite(124, 123);
          _delay_ms(50);
          EepromWrite(125, tokk);
          caltok1 = tokk-caltok;
          tokd = caltok1;
          calmod=0;
          _delay_ms(200);
          for(i=allleds-2; i>=0; i--){
            WriteLed_on(i);
            _delay_ms(200);
            WriteLed_off(i);}}
    }


    int main(void) {

       DDRD=0b11100000;
       DDRB=0b00000111;

       PORTD=0b11100000;
       PORTB=0b00000111;
       _delay_ms(500);
       PORTD=0b00000000;
       PORTB=0b00000000;

       PORTB |= (1<<3);

       if(EepromRead(120)==123) {
       caltok = EepromRead(121);}
         else{caltok = 10;}
       if(EepromRead(124)==123) {
       caltok1 = EepromRead(125)-caltok;}
         else{caltok1 = 58-caltok;}
       calmod = 0;
       tok0 = caltok;
       tokd = caltok1;


    while (1==1) {
       tok=0;

       uint8_t k;
       for(k=0;k<5;k++){
       tok=tok+AdcRead(2);
       _delay_ms(4);}
       tok=tok/5;

       uint8_t j;
       tokmodd=tokmod;
       for(j=allleds; j>0; j--){
         if(tok > (tok0+tokd*(j-1))){
         tokmod=j;
         break;}
         else{tokmod=j-1;}}

       if(tokmodd!=tokmod){
         SetLeds(tokmod);}

       button = readP(PINB,3);
       if(button && !calbut) {
         calbut=1;
         _delay_ms(2000);
         button = readP(PINB,3);
         if(button) {
         calibrovka();
         }}
       if(!button && calbut) {calbut=0;}

       _delay_ms(180);

    }return 0;}
     
     
    Последнее редактирование: 29 окт 2017
  13. А х@p знает!
    Я вот ни одной Р\У не просрал не считая машинки в которую поставил акумы от ноута!:)
     
  14. "][/SPOILER]"][/SPOILER]"][/SPOILER]
     
  15. davidgolikh

    davidgolikh Нуб

    Я крутой
     
  16. davidgolikh

    davidgolikh Нуб

    Я отличный
     
  17. davidgolikh

    davidgolikh Нуб

    Я хочу сделать айфон 10
     
  18. Airbus

    Airbus Радиохулиган Модератор

    Мальчик иди и учи уроки
     
  19. akl

    akl Гуру

    кто-нибудь шарит в V-USB ?
     
  20. NikitOS

    NikitOS Король шутов Администратор

    Aliexpress меня мучает весь день....думал заказать ESP'шок но он сказал в "другой раз" и тупо сказал что банк отменил оплату.........
    достал