avatar_13_chip_13

Замена или модернизация TF-100

Автор 13_chip_13, 18 Март 2020 в 16:33

« назад - далее »

0 Пользователи и 2 гостей просматривают эту тему.

dstasv

Цитата: 13_chip_13 от 01 Апр. 2020 в 23:35
Даже если и получиться, получаем те же грабли, вкл/выкл и никакой плавности, я понимаю зачем так сделано, но мне так не нравиться, хочу как в машине на коробке автомат и медленно плавно ездить и быстро нормально ездить давя только на один орган управления ( :-) как то прозвучало странно).
Плавность управления будет, согласно плавности работы датчика холла, кто то последовательно еще встречные диоды ставит для пущей плавности
Скорость при аналоговом управлении получалась на пару км больше

13_chip_13

Ну скорость больше это скорее всего, потому что дисплей  не слал максимальное значение контроллеру (по каким причинам нужно выяснять), в общем это не о том тема.

13_chip_13

Заказал курок, и пока жду решил сначала сделать несколько другое устройство, в принципе может даже мои "хотелки" и покроет. Идея не новая даже где-то мне попадалась у кого то, но штука настолько простая что искать, а потом разбираться в чужом лень было, быстрее самому сообразить. Суть устройства: разорвать линию от курка в STM8 и вклинить туда контроллер который будет "перебивать" характеристику курка. В качестве базы выбрал tyni13, просто потому что лежит несколько штук без дела. Пока только виртуально, с этим кризисом доступа нету ко всем деталям. Софт в Code Vision, просто потому что AVR не мой профиль и что то большое разворачивать смысла нету. Пока только набросок (массив соответствия на глазок), поэтому исходник будет после того как более менее что то действующее сделаю.
Схема в протеусе  (только для отладки) и прошивка

13_chip_13

#21
Дошли руки сделать расширение диапазона курка: https://youtu.be/iXfA16LLu_g


В архиве схема в протеусе, скрин основной части схемы в JPG (если протеуса нету), разводка платы в layout50 и прошивка МК tiny13A. Исходник со всеми "какашками" от CV здесь.

/*******************************************************
This program was created by the
CodeWizardAVR V3.12 Advanced
Automatic Program Generator
© Copyright 1998-2014 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : GAZ
Version :
Date    : 09.04.2020
Author  :
Company :
Comments:
Для изменения прогрессии курка газа


Chip type               : ATtiny13A
AVR Core Clock frequency: 9,600000 MHz
Memory model            : Tiny
External RAM size       : 0
Data Stack size         : 16
*******************************************************/

#include <tiny13a.h>

#include <delay.h>

#define BUTTON   !PINB.1
#define LED_ON   PORTB.2=0
#define LED_OFF  PORTB.2=1
#define LED_PORT PORTB.2
// таблица соответствия входа (нулефая строка) выходу (первая строка) в значения АЦП
flash unsigned char table_progress[]={
       60,  62,  65,  67,  68,  69,  71,  73,  75,  77,  79,  82,  85,  88,  91,  94,  97,  100, 103, 106, 109, 112, 115, 118, 121, 124, 127, 130, 133, 136, 139, 142, 145, 148, 151, 154, 157, 160, 163, 166, 169, 172, 175, 178, 
       60,  109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 160, 164, 168, 172, 176, 180, 184, 188, 194, 200
                                    };                 
flash unsigned char *p_table_progress; // указатель на активную таблицу 
unsigned char size_tab=0; // количество столбцов в массиве       

#define SIZE_FILTER 8
unsigned char s_tmp_filter[SIZE_FILTER];
unsigned char s_tmp_count_filter = SIZE_FILTER-1;

enum{
    normal,
    setup,
    test
}mode;

unsigned char adc_data;

// Bandgap Voltage Reference: Off
#define ADC_VREF_TYPE ((0<<REFS0) | (1<<ADLAR))

// ADC interrupt
interrupt [ADC_INT] void adc_isr(void)

    unsigned int tmp_summ = 0; 
    unsigned char tmp_count = SIZE_FILTER;   
   
    s_tmp_filter[s_tmp_count_filter] = ADCH;
    if(s_tmp_count_filter==0) s_tmp_count_filter = SIZE_FILTER-1;   
    s_tmp_count_filter--;
   
    // просумировали все элементы массива   
    while(tmp_count--){
        tmp_summ += s_tmp_filter[tmp_count];       
    }
   
   adc_data=tmp_summ/SIZE_FILTER;
    // Start the AD conversion
    ADCSRA|=(1<<ADSC);
}

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
    // Reinitialize Timer 0 value
    TCNT0=0x01;

    if(mode == setup)
    {
        static unsigned int s_tmp_timer=5000;
        s_tmp_timer--;     
        if(s_tmp_timer==0){   
            s_tmp_timer=5000; 
            LED_PORT = ~LED_PORT;
        }   
    }
    else
    {     
        static unsigned int s_tmp_timer_1000 = 5000; // секунда
        static unsigned int s_tmp_timer_200 = 1000; // 0.2 секунды
        s_tmp_timer_1000--;
        s_tmp_timer_200--;     
        if(s_tmp_timer_1000==0){   
            s_tmp_timer_1000=5000; 

        }         
        if(s_tmp_timer_200==0){   
            s_tmp_timer_200=1000; 
         
        }           
                   
    }
}

void main(void)
{
    // Crystal Oscillator division factor: 1
    #pragma optsize-
    CLKPR=(1<<CLKPCE);
    CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
    #ifdef _OPTIMIZE_SIZE_
    #pragma optsize+
    #endif

    // Input/Output Ports initialization
    // Port B initialization
    // Function: Bit5=In Bit4=In Bit3=Out Bit2=In Bit1=In Bit0=Out
    DDRB=(0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (1<<DDB2) | (0<<DDB1) | (1<<DDB0);
    // State: Bit5=T Bit4=T Bit3=T Bit2=T Bit1=P Bit0=0
    PORTB=(0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (1<<PORTB1) | (0<<PORTB0);

    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 1200,000 kHz
    // Mode: Fast PWM top=0xFF
    // OC0A output: Non-Inverted PWM
    // OC0B output: Disconnected
    // Timer Period: 0,21333 ms
    // Output Pulse(s):
    // OC0A Period: 0,21333 ms Width: 0 us
    TCCR0A=(1<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (1<<WGM01) | (1<<WGM00);
    TCCR0B=(0<<WGM02) | (0<<CS02) | (1<<CS01) | (0<<CS00);
    TCNT0=0x00;
    OCR0A=0x00;
    OCR0B=0x00;

    // Timer/Counter 0 Interrupt(s) initialization
    TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (1<<TOIE0);

    // External Interrupt(s) initialization
    // INT0: Off
    // Interrupt on any change on pins PCINT0-5: Off
    GIMSK=(0<<INT0) | (0<<PCIE);
    MCUCR=(0<<ISC01) | (0<<ISC00);

    // Analog Comparator initialization
    // Analog Comparator: Off
    // The Analog Comparator's positive input is
    // connected to the AIN0 pin
    // The Analog Comparator's negative input is
    // connected to the AIN1 pin
    ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIS1) | (0<<ACIS0);
    // Digital input buffer on AIN0: On
    // Digital input buffer on AIN1: On
    DIDR0=(0<<AIN0D) | (0<<AIN1D);

    // ADC initialization
    // ADC Clock frequency: 150,000 kHz
    // ADC Bandgap Voltage Reference: Off
    // ADC Auto Trigger Source: Free Running
    // Only the 8 most significant bits of
    // the AD conversion result are used
    // Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: On
    DIDR0|=(0<<ADC0D) | (0<<ADC2D) | (0<<ADC3D) | (0<<ADC1D);
    ADMUX= 2 | ADC_VREF_TYPE;
    ADCSRA=(1<<ADEN) | (1<<ADSC) | (1<<ADATE) | (0<<ADIF) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);
    ADCSRB=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);

    mode = normal; // режим работы штатный
    LED_OFF;
    if(BUTTON){ // если при старте нажата кнопка
        LED_ON;
        delay_ms(1500);
        if(!BUTTON){     
            LED_OFF;
            delay_ms(1500);
            if(BUTTON) mode = setup;
        }
    }
    if(mode == normal){
        LED_OFF;
    }
    p_table_progress = table_progress; 
    size_tab = sizeof(table_progress)/2;


    // Global enable interrupts
    #asm("sei")

    while (1){   
        if(mode == normal){
            unsigned char count_mas = 0, tmp_adc_data=adc_data;
            unsigned char tmp=*p_table_progress;             
            for(count_mas=1;count_mas<size_tab;count_mas++)
            {                                                           
                tmp = *(p_table_progress+count_mas); 
                if(tmp_adc_data<=tmp) break;
            }
            // простейщая интерполяция по наибольшему из вектора нормирования (первая строка),
            // если делать линейно пожирает вычислительные ресурсы, лучше сделать массив побольше                                                     
            OCR0A = *(p_table_progress+size_tab+count_mas-1); 
            // формирование задания с помощью уравнений, не соответствует текущей таблице, нужно подгонять уравнения     
            /*if(tmp_adc_data<61) OCR0A = tmp_adc_data;
            else if(tmp_adc_data<100) OCR0A = 109+(36*tmp_adc_data)/128;   
            else if(tmp_adc_data<139) OCR0A = 79+(75*tmp_adc_data)/128;   
            else if(tmp_adc_data<200) OCR0A = 21+tmp_adc_data;
            else OCR0A = 200;*/     
        }
        else{OCR0A=0;} 
    }
}

Было в планах подсоединить кнопку еще (на MODE курка), светодиод и второй канал АЦП, чтоб можно было выбирать активный курок, характеристики менять и даже начал это писать поначалу, но потом подумал, что сейчас это мне не надо, устраивает как есть, если будет интерес у кого нибудь, можно продолжить будет "допиливание".

Пы.сы. да уж эти ограниченные ресурсы, по работе привык не ограничиваться такой мелочью, а тут даже интерполяцию сделать тяжко нормальную, пришлось раздувать массив, килобайт памяти это не хухры мухры  :facepalm:. Можно было бы переписать программу курка, что было бы конечно лучше, но схемы именно такой версии курка нету, часть дорожек под дисплеем находиться, и похоже он управляется напрямую от МК, без драйвера дисплея (хотя может под дисплей спрятали), курочить свой не вариант, а найти сгоревший, как выяснилось не так то и просто за вменяемые деньги (вменяемые это ну десятая стоимость нового).

arthuru

я пробовал растянуть диапазон аналоговым способом. Подтянул выход ДХ на плюс через резистор для увеличения напряжения, но при включении сразу выскакиевает ошибка. Но если подтянуть после включения то работает нормально. Можно поставить последовательно с резистором маленький р-канальный мосфет с большой емкостью в затворе для задержки включения

13_chip_13

Цитата: arthuru от 05 Июнь 2020 в 10:36
я пробовал растянуть диапазон аналоговым способом. Подтянул выход ДХ на плюс через резистор для увеличения напряжения, но при включении сразу выскакиевает ошибка. Но если подтянуть после включения то работает нормально. Можно поставить последовательно с резистором маленький р-канальный мосфет с большой емкостью в затворе для задержки включения
Ну ясен... пень. Если при включении напряжение с холла больше вольта то ошибка, это как бы очевидно, что должна быть такая защита от поломки датчика.
Да, можно всё что угодно, но вы не получите моего эффекта без сложной схемы на расыпухе, потому что нужна именно нелинейность задания (тут вариант магнит хитрожопым методом клеить можно, но это опять таки геморой и если потребуется перестроить то опять - геморой).
Сейчас потихоньку занимаюсь тем что пульт делаю свой на базе esp32, суть простая: коробка в которую будет входить сигнал курка (ну и там еще резервных входов и выходов, подключается по стандартному штекеру). Далее если нужно настроить что то или мониторить параметры во время езды, то ставишь смартофон и радуешься.

MasterCat

to 13_chip_13:

А есть характеристика...э...преобразований этого напряжения с курка? Посмотреть бы в каком-нибудь более наглядном виде чем код программы.
Kugoo M4 PRO (17Ah)

arthuru

[user]13_chip_13[/user], подскажи еще. Почему такая большая задержка на курок газа? Это проц в дисплее так тормозит или в контре? После аналогового управления маленько подбешивает, там нет такой задержки...

13_chip_13

#26
Цитата: MasterCat от 06 Июнь 2020 в 14:57
А есть характеристика...э...преобразований этого напряжения с курка? Посмотреть бы в каком-нибудь более наглядном виде чем код программы.
Там массив, вот прямо в начале листинга, ну или можете запустить протеус (всё необходимое в приложении есть).
Вот так будет, желтый с курка (идеализированный, реальный не из нуля конечно будет), синий  преобразованный:



Цитата: arthuru от 06 Июнь 2020 в 16:19
[user]13_chip_13[/user], подскажи еще. Почему такая большая задержка на курок газа? Это проц в дисплее так тормозит или в контре? После аналогового управления маленько подбешивает, там нет такой задержки...
Меня этот момент сильно не интересовал когда я мониторил протокол, но если правильно помню, то там изменения курка сразу отображались в UART без задержек. Но там передача достаточно медленная идёт (может где то тут при описании протокола я это писал) может это и даёт такой эффект, ну примерно весь пакет уходит за не быстрее 0,5 секунды (осцилограммы не сохранял там это видно прям было).

arthuru

#27
а можно както ускорить передачу этих пакетов?
может поставить ретранслятор пакетов который будет получать данные о полжении курка напрямую и замещать данные от проца дисплея

13_chip_13

Цитата: arthuru от 07 Июнь 2020 в 19:58
а можно както ускорить передачу этих пакетов?
может поставить ретранслятор пакетов который будет получать данные о полжении курка напрямую и замещать данные от проца дисплея
Может и можно, попробуйте, расскажите потом что получилось.

MasterCat

13_chip_13 !

Цитата: 13_chip_13Вот так будет, желтый с курка (идеализированный, реальный не из нуля конечно будет), синий  преобразованный

Спасибо!  Я правда не понял этот большой горизонтальный участок. Ведь я так понял, что Вы как раз боролись в частности с тем, что в исходном варианте мертвая зона в начале. 

Еще бы масштаб сетки Вы подсказали.

Еще вопросик, на STM  3,3V, а на Холле тоже 3,3V питание или 5V ?  Или в этом курке везде 3,3  на слаботочке?
Kugoo M4 PRO (17Ah)

13_chip_13

В этой версии 3,3 вольта (но 5-ти вольтовое питание тоже должно быть, например для USB разъёма типо зарядки), но там от ревизии зависит, есть и 5 вольт тоже (именно от него схема гуляет по сети). Конкретно с этого схему не срисовывал, без надобности было.
Масштаб сетки по оси x - просто время, по вертикали - предел 2,6 вольта  где-то. По сути да - убрать мёртвую зону и растянуть значения для малых скоростей и сделать более жёстко для скоростей побольше (там три участка прям видно с разным наклоном).

MasterCat

Кстати, на альтернативном форуме чел предлагал сабж за недорого, если вдруг донор еще нужен.

https://electro.club/forum/m4_pro?page=266
Kugoo M4 PRO (17Ah)

arthuru

[user]13_chip_13[/user],  а какое максимальное напряжение на АЦП stmки?

13_chip_13

Цитата: arthuru от 14 Июнь 2020 в 18:47
[user]13_chip_13[/user],  а какое максимальное напряжение на АЦП stmки?
Однозначно не больше напряжения питания чипа, но может быть и меньше, нужно в даташите смотреть.
Но скорее всего на этом  дешманском чипе будет напряжение питания - максимальным.

arthuru

так а как ты расчитывал шим если не знаешь? питание 3,3В но ацепирует ли он до U питания или это тупо предельное значение? у меня похожий курок, так там максимум с ДХ идет 2,5В

13_chip_13

Цитата: arthuru от 15 Июнь 2020 в 10:49
так а как ты расчитывал шим если не знаешь? питание 3,3В но ацепирует ли он до U питания или это тупо предельное значение? у меня похожий курок, так там максимум с ДХ идет 2,5В
Я же где то тут писал что привязки к напряжению нету, хоть 3,3 там , хоть 5, работает одинаково, потому что считается всё в попугаях (8-ми битное значение АЦП -> приводиться к 8-ми битному ШИМ). В данной реализации не зачем усложнять еще и вычислением напряжения.
Да и вообще если сложно потратить 5 минут на то чтобы посмотреть даташит, но не сложно потратить 5 минут чтобы написать сообщение...,  лучше не стоит заморачиваться.
Да и если подумать датчики холла в подобных курках и не должны выдавать сигнал от нуля до максимума вольт (во всяком случае в продуманной системе), иначе как определять ошибку обрыва или замыкания курка?