Перейти к содержанию

Масштабировать АЦП и ШИМ


Securety

Рекомендуемые сообщения

Всем добрый день, есть проект у меня в MPLAB X IDE v5.10 компилятор XC8 использую модуль ацп и шим мк 12F683 настройка кварц на 8мгрц 8бит шим 10бит ацп.

Измерение напряжения производится на среднем выводе переменного резистора, линия микроконтроллера GP0/AN0 используется в качестве аналогового входа модуля АЦП. Напряжение на среднем выводе переменного резистора варьируется от 0 до 5В, для АЦП используется внутреннее опорное напряжение от источника питания Vdd, то есть 5В.

Суть вопроса каким образом можно масштабировать ацп и шим на разную частоту для 19.61кгрц или выше 31249кгрц? с 10битным ацп. По даташиту на числовое значение для регистра PR2, определяющее период ШИМ ставлю число 255 – это 7.8кгрц частота коэффициента предделителя TMR2 (1:1) ставлю все нормально работает скважность 0-100% от 0 - 5в крутим потенциометр в проекте «proteus» (приложил) и прошивку lEGO3.X.production7800.hex используется 8бит ацп. Если я ставлю частоту выше, то происходит срыв после 2.5в все это понятно уменьшается разрядность шим, длительность импульса превышает период импульсов. То есть нужно поднимать частоту тактового генератора мк до 20мгрц чтобы, у нас люди успевали запрыгнуть в вагон с увеличением скорости (частота).

Теперь используем 10 битный ацп и теперь с меньшими частотами мы теряем скважность при кручений потенциометра причем очень много с 0-5в. А с увеличением частоты мы прибавляем скважность, шаг более грубый при кручений потенциометра но удалось методом подгонки запись числа .63 в регистр периода ШИМ получить скважность от 0-98% это хорошо но потом я в тупике.

Заметил одну особенность при уменьшений частоты когда переменный резистор выкручен до 5в до конца число 31us (скважность от частоты зависимость) всегда одно и тоже фото приложил. Как можно повлиять на это? Ведь удалось подогнать на частоту 31249кгрц скважность от потенциометра 0-5в. Как с выше частотой поступить или по ниже? Как масштабировать с 0-5.

Все прошивки и варианты приложил и сам проект MPLAB X IDE.

Понятно что выше 31кгрц 10бит ацп происходит срыв после 95% скважности / ниже частота теряем % скважности.

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

                    bcf CCP1CON,5

                    bcf CCP1CON,4

                      bsf STATUS,RP0

                      btfss ADRESL,7

                      goto a1

                      bcf STATUS,RP0

                      bsf CCP1CON,5

                      bsf STATUS,RP0

a1                 btfss ADRESL,6

                      goto a2

                      bcf STATUS,RP0

                      bsf CCP1CON,4

a2                bcf STATUS,RP0

                      rrf ADRESH,1

                      rrf ADRESH,1

                    bcf   ADRESH,7

                      bcf   ADRESH,6

doki.7z

Ссылка на комментарий
Поделиться на другие сайты

Можно понизить разрядность ШИМ , тем самым получив большую частоту . Например сделать от 0 до 100 ШИМ , и также программно понизить разрядность АЦП . Например :

uint32_t ADC = Adc_read();

PWM = ADC*100 / 1024;

А вообще мелкие пики убогие в плане производительности ..

 

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Кто нибуть знает формулу по какой арифметике с модуля АЦП значения регистра ADRESH загружаются числа в регистр CCPRIL длительности импульса шим. Как полагаю учитываются или рассчет  идёт от битов. Просто хочу сопоставить значения периода за весь интервал с длительностью импульса. Нигде не нашёл арифметику с битами. 

Как найти код АЦП и напряжния и шаг и много ещё чего я знаю. Но когда идет подача в шим через ацп хз как там мк считает и переводит это с 0-5 в.

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Так я выше вам почти весь пример привел. PWM загружаете в регистр ШИМ , и все будет работать.

Там есть нюанс : нужно маску накладывать на регистр и вычитывать только два бита . Потом эти два бита поместить в переменную 16бит и сдвинуть на 8. Второй регистр 8 бит просто скопировать в эту переменную , не трогая те два бита. Я точно не помню , но по моему это с АЦП такой прикол. 

Код тот дома в компе.

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

4 часа назад, Securety сказал:

Кто нибуть знает формулу по какой арифметике с модуля АЦП значения регистра ADRESH

 

4 часа назад, Securety сказал:

Как найти код АЦП и напряжния и шаг и много ещё чего я знаю.

Нашел свой проект под PIC18F1320. Лови код:

 uint16_t ADC_read(void){
 uint16_t adval=0;
    ADCON0 = 0x01;
    ADCON1 = 0xEE;
    ADCON2 = 0x1D;

    delay_ms(1);   
    ADCON0 |= 0x02;
    while(ADCON0 == 0x02);
    adval = (ADRESH << 8) + ADRESL;
    return adval;
}

void PWM_set(uint16_t pwm_set)
{
  uint16_t pwm_reg=0;
  uint16_t pwm_reg2=0;
  
  pwm_reg = pwm_set;
  pwm_reg2=pwm_reg<<6;    
  pwm_reg2=pwm_reg2>>2;   
  CCP1CON &= 0b11001100;  
  CCP1CON |= pwm_reg2;    
  CCPR1L=pwm_reg>>2;
}

Все очень просто ! 
Потом вот в вечном цикле мы подгружаем данные с АЦП в модуль ШИМ:

while(1){
    PWM_set((ADC_read()/80));
delay_ms(50);
}

 

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

  • 2 недели спустя...

в 12683 это будет не так., смотри

в регистр PR2 загружается старшие 8 бит периода ШИМ , таймер TMR2 8 разрядов + 2 разряда берется из предделителя таймера или из счетчика тактов осциллятора, итого получается 10 разрядов. при Fosc=8MHz и ШИМ=10бит максимальная частота ШИМа Fpwm=7.8125KHz

для получения нужной длительности импульса ШИМ 10 разрядов , старшие 8 разрядов загружаются в регистр CCPR1L, младшие 2 разряда загружаются в пятый и четвертый биты регистра CCP1CON<5:4>.

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

Ссылка на комментарий
Поделиться на другие сайты

для 8ми разрядного ШИМ загрузку длительности импульса делал так:

Скрытый текст

TMR2IF_Check:
       btfss PIR1,TMR2IF
         goto TMR2IF_Skip
         bcf PIR1,TMR2IF
        clrf CCPR1L
        movlw (1<<RB0)
        xorwf PORTB,f 
     
        decfsz count_tact,f
          goto Label_1
        movlw  .128           ;  кол-во градаций синуса
        movwf count_tact
        movlw (1<<RB7)| (1<<RB6)|(1<<RB5)|(1<<RB4)
        xorwf PORTB,f   
Label_1   

;************** загруза длительности импульса ШИМ 8бит
        movf  count_tact,w   
        call  Mass_sinus
        movwf CCPR1L 
;************* сдвигаем бит0 -> CCP1CON<4>
        bcf   STATUS,C
        rrf   CCPR1L,f
        btfss STATUS,C
          bcf CCP1CON,CCP1Y
        btfsc STATUS,C
          bsf CCP1CON,CCP1Y
;************* сдвигаем бит1 -> CCP1CON<5>
        bcf   STATUS,C
        rrf   CCPR1L,f
        btfss STATUS,C
          bcf CCP1CON,CCP1X
        btfsc STATUS,C
          bsf CCP1CON,CCP1X  

          
TMR2IF_Skip:
       

int_exit:
	movf    status_temp,w     ; retrieve copy of STATUS register
	movwf	STATUS            ; restore pre-isr STATUS register contents
	swapf   w_temp,f
	swapf   w_temp,w          ; restore pre-isr W register contents
	retfie                    ; return from interrupt
;************************************************************************
;

 

 

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

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

IMHO я правильно понимаю ваш код выше пример, даёт возможность работать без переполнения TMR2, на разные частоты выше без срыва скважности .

 

Ссылка на комментарий
Поделиться на другие сайты

нет, не правильно. ШИМ работает на основе переполнения TMR2. новая скважность ШИМ загружается в момент переполнения  таймера, и код предотвращает обновление скважности ШИМ  в момент переполнения таймера. к изменению частоты ШИМ это не имеет никакого отношения, к тому же изменение частоты ШИМ по рекомендациям микротельных возможно только при отключенном ШИМ.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...