www.kn34pc.com

Форум на силистренските радиолюбители
Дата и час: 01 Дек 2023, 22:57

Часовете са според зоната UTC + 2 часа [ DST ]




Напиши нова тема Отговори на тема  [ 12 мнения ] 
Автор Съобщение
МнениеПубликувано на: 02 Юли 2021, 08:41 
Offline
Аватар

Регистриран на: 07 Дек 2006, 18:24
Мнения: 1447
Местоположение: Силистра
В схеми съм срещал потенциометър/реостат, с който се регулира напр. честота (промяна на стойност на променлива ми е достатъчно), a PIC16F628A/84 няма аналогови входове. По какъв начин?

Напр. в електронния телеграфен ключ тук - регулиране на скоростта чрез R6
https://www.qsl.net/dl4yhf/pic_key.html

Идея 1:
- RA0 като изход = лог 0 - разряд на C1
- RA0 като вход, заряд на C1 през R6 + R2
- измерване на времето до достигане от лог 0 до лог 1 = стойност за използване, отговаряща на ъгъла на завъртане на потенциометъра
- loop в началото, отново RA0 като изход = лог 0 ...

Други идеи?


Прикачени файлове:
key1cir1.gif
key1cir1.gif [ 38.88 KiB | Прегледано 3032 пъти ]
Върнете се в началото
 Профил  
 
МнениеПубликувано на: 04 Юли 2021, 22:18 
Offline
Аватар

Регистриран на: 07 Дек 2006, 18:24
Мнения: 1447
Местоположение: Силистра
Заработи :smt041.

От първи опит без настройка:

потенциометър 47k, кондензатор 22nF
положение min -> 30
положение max -> 837
Код за потвърждение:
void main() {
  lcd_init();
 
  while(TRUE) {
    output_low(PIN_A2);
    delay_ms(1);
    output_float(PIN_A2);   
    t0 = get_ticks();
    do {
    } while(!input_state(PIN_A2));
    t1 = get_ticks();
    vol = t1 - t0;
   
    lcd_gotoxy(1, 1);
    lcd_putc("   ");
    lcd_gotoxy(1, 1);
    printf(lcd_putc, "%Lu", vol);
   
    delay_ms(500);
  }
}

като
Код за потвърждение:
#USE timer(TIMER = 1, TICK = 1us, BITS = 32, NOISR)


Прикачени файлове:
pic16f628a_analog_pot_to digital_input_lcd.gif
pic16f628a_analog_pot_to digital_input_lcd.gif [ 52.85 KiB | Прегледано 3004 пъти ]
Върнете се в началото
 Профил  
 
МнениеПубликувано на: 05 Юли 2021, 20:52 
Offline
Аватар

Регистриран на: 07 Дек 2006, 18:24
Мнения: 1447
Местоположение: Силистра
Повече от 20 часа (с многократни спирания/пускания) настройката от потенциометър дава стойност 201 (случайно показание), независимо от отн. некачествения задаващ кондензатор 22nF. R-C е добре да са близо до MCU и да има локална филтрация.

Методът считам за себе си за приложим: към други изводи, към други микроконтролери :mail.


Върнете се в началото
 Профил  
 
МнениеПубликувано на: 09 Авг 2021, 19:53 
Offline
Аватар

Регистриран на: 07 Дек 2006, 18:24
Мнения: 1447
Местоположение: Силистра
Още един телеграфен ключ с още един начин на регулиране - потенциометърът е между два извода.
Но с японскя език, а и с асемблер трудно се справям засега за да хвана насоката :wink.

Идеи за отчитане на ъгъла на завъртане на потенциометъра?

PIC16F84A Elekey prototype
http://jh7ubc.web.fc2.com/pic/PIC16F84A/PIC_Elekey.html
http://jh7ubc.web.fc2.com/pic/PIC16F84A/PIC-Elekey.asm


Прикачени файлове:
PIC-Elekey.gif
PIC-Elekey.gif [ 7.42 KiB | Прегледано 2957 пъти ]
Върнете се в началото
 Профил  
 
МнениеПубликувано на: 10 Авг 2021, 11:44 
Offline

Регистриран на: 05 Юни 2020, 16:51
Мнения: 27
Ми функцията SPEED сваля RA2 = 0 и цикли докато RA1 = 0

Повреме на цикъла увеличава променливата SPD.
Ако превърти (стане 0), връща SPD = 26

Ако не превърти, я дели на 2 и я сравнява дали е между 7 и 25, ако да връща я като резултат. Ако е по-малка връща 7, Ако е по-голяма връща 26. И преди да се върне вдига RA2 = 1. Нещо такова.


Върнете се в началото
 Профил  
 
МнениеПубликувано на: 10 Авг 2021, 13:30 
Offline
Аватар

Регистриран на: 07 Дек 2006, 18:24
Мнения: 1447
Местоположение: Силистра
Да, RA2 е само изход, RA1 е само вход.

Установявам изхода в противопложното лог състояние на напрежението върху на кондензатора и чакам да се установи (лог 0 или 1). Времето за зареждане/разреждане е функция от R и C. C е постоянно, сл. променливата за времето ще е функция от положението на потенциометъра.

Мога да пробвам да меря на зареждане и на разреждане. (Като генератор на триъгълни импулси стана :)).

Oграниченията на променливата в max и min страна, както и "броенето" (или измерване на времето) са ясни.
Напр. get_ticks() през таймер е достъпно.


Върнете се в началото
 Профил  
 
МнениеПубликувано на: 10 Авг 2021, 13:35 
Offline

Регистриран на: 05 Юни 2020, 16:51
Мнения: 27
Само че, е нелинейно. За да се линеаризира се прави зареждането на кондензатора през генератор на ток.


Върнете се в началото
 Профил  
 
МнениеПубликувано на: 10 Авг 2021, 16:16 
Offline
Аватар

Регистриран на: 07 Дек 2006, 18:24
Мнения: 1447
Местоположение: Силистра
Кодът превръща втория вариант в първи :), т.е. са вариации. Във втория e изходът RA2 и входът RA1 са статични.
Недостатък: два ангажирани извода.

С анализ на времето на зареждане и разреждане не се получи - показанието скача между две стойности. Вероятно заради несиметрията на логическите нива около средата?

Оставям "зареждане" с отчитане на "време за зареждане", като пропускам задния фронт.
Код за потвърждение:
void main() {
  lcd_init();
 
  while(TRUE) {
    output_high(PIN_A2);

    t0 = get_ticks();
    do {
    } while(!input_state(PIN_A1));
    t1 = get_ticks();
    vol = t1 - t0;
   
    lcd_gotoxy(1, 1);
    lcd_putc("   ");
    lcd_gotoxy(1, 1);
    printf(lcd_putc, "%Lu", vol);
   
    delay_ms(500);
   
    output_low(PIN_A2);
   
    delay_ms(200);
  }
}

По-долу, на симулатора: показания при две положения на потенциометъра.
Ще пробвам по-късно и реална конструкция.


Прикачени файлове:
1.jpg
1.jpg [ 137.06 KiB | Прегледано 2935 пъти ]
2.jpg
2.jpg [ 130.83 KiB | Прегледано 2935 пъти ]
Върнете се в началото
 Профил  
 
МнениеПубликувано на: 10 Авг 2021, 19:58 
Offline
Аватар

Регистриран на: 07 Дек 2006, 18:24
Мнения: 1447
Местоположение: Силистра
И на breadboard схемата и кодът работят. :comp


Прикачени файлове:
pic16f628a_analog_pot_to digital_input_lcd_02.gif
pic16f628a_analog_pot_to digital_input_lcd_02.gif [ 53.19 KiB | Прегледано 2937 пъти ]
Върнете се в началото
 Профил  
 
МнениеПубликувано на: 12 Авг 2021, 18:38 
Offline

Регистриран на: 15 Дек 2012, 09:51
Мнения: 51
Защо просто не използваш микроконтролер с АЦП ?
Тези гимнастики са от времето когато пълнолетният вече 16F84 е бил в детската градина. :)


Върнете се в началото
 Профил  
 
МнениеПубликувано на: 12 Авг 2021, 19:21 
Offline
Аватар

Регистриран на: 07 Дек 2006, 18:24
Мнения: 1447
Местоположение: Силистра
Аз и от устройствата, в които евентуално в бъдеще ще се вграждат тези идеи, нямам нужда.
В случая за хобито и "спорта" са ми интересни алгоритмичните способи, математическият апарат към тях и превръщането им в програмен код.


Върнете се в началото
 Профил  
 
МнениеПубликувано на: 13 Авг 2021, 12:47 
Offline

Регистриран на: 15 Дек 2012, 09:51
Мнения: 51
Може да се направи на по-висока честота. И да се измерва периода но на 10-20 импулса примерно. Или просто да се измери честотата, но трябва да се използва прекъсване в момента на отчитане на честотата.


Върнете се в началото
 Профил  
 
Покажи мненията от миналия:  Сортирай по  
Напиши нова тема Отговори на тема  [ 12 мнения ] 

Часовете са според зоната UTC + 2 часа [ DST ]


Кой е на линия

Потребители, разглеждащи този форум: 0 регистрирани и 1 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
cron
Форумът се задвижва от phpBB® Forum Software © phpBB Group
Преведено от yarnaudov.com