Fórum témák

» Több friss téma
Fórum » PIC kezdőknek
 
Témaindító: Placi84, idő: Okt 3, 2005
Témakörök:
- A PIC ÖSSZES Vdd és Vss (AVdd és AVss) (tápfeszültség) lábát be kell kötni!
- A táplábak mellé a lehető legközelebb 100nF-os KERÁMIA kondenzátorokat kell elhelyezni.
- Az MCLR lábat, 10kohm-mal fel kell húzni a Vdd tápfeszültségre.
- Külső kvarc használatakor 4MHz-ig XT, a fölött pedig HS konfigurációt kell beállítani.
- Stabilizált tápegységet kell használni, a kapcsoló üzemű "telefon töltő" adapterek okozhatnak hibákat.
- Programozáshoz, használj lehetőleg PICKIT2 vagy 3 programozót. Kerülendő a JDM (soros porti) programozó.
- A PIC adatlapja (PDF), tartalmazza a lábak kiosztását és a PIC minden paraméterét. Az adatlap ingyen letölthető!
- Egyes PIC típusoknál az RA4 nyitott nyelőelektródás (Csak lefelé húz L szintre, H szintet nem ad ki!)
- Ha a PGM lábat digitális ki-/bemenetnek használod, az alacsony feszültségű programozási lehetőséget le kell tiltani.
Lapozás: OK   1050 / 1203
(#) ktamas66 válasza don_peter hozzászólására (») Okt 13, 2018 /
 
Lehet félreértem a feladatot, hogy csak a PWM jel aktív részén szeretnél feszültséget mérni. Számolj utána mennyi ideig tart ez az aktív rész, mennyi ideig tart mérés (vagy megmérheted a szimulátorban).
(#) don_peter válasza ktamas66 hozzászólására (») Okt 13, 2018 /
 
+-12v 1KHz-es PWM jelet szeretnék visszamérni, a PIC 1MHz-en dolgozik.
A mérendő 12v-os jel 5v-ra vissza is van ellenáramláson keresztül osztva.
A feladat igazából annyi, hogy folyamatosan 1-5mp-es rendszerességgel mérjek egy aktuális feszültségszintet. A PWM jel ellenállásokkal lenne terhelve és ezt kell figyelnem, hogy mikor milyen a terheltség.
Ez a rész PWM jel nélkül szépen dolgozik is, de PWM jelet visszamérni helyesen, pontosan már kicsit nehezebb.
Egyelőre hülyeségeket mérek, ezért kértem a segítséget.
sonajkniz fórumtársunk erre írt egy példát, amelyet át kell forgatni C nyelvre, hogy maximálisan meg is értsem a működését.
Logikailag értem is amit ő mond, de a megoldása valahogy nem akar összejönni.
(#) Hp41C válasza don_peter hozzászólására (») Okt 13, 2018 /
 
Mekkora a PWM frekvencia?
Képezz egy "átlagolót" (az ellenállás osztót egészítsd ki egy kapacitással), ami a PWM frekvenciáját elnyomja. Mérd a szűrt jelet az A/D -vel.
(#) don_peter válasza Hp41C hozzászólására (») Okt 13, 2018 /
 
1KHz. Az ellenállás osztás után mekkora kondi kellene? Gondolom elektrolitlt kell használni.
(#) DJozso hozzászólása Okt 13, 2018 /
 
Sziasztok! Készítettem egy váltó fokozat visszajelzőt motorra mikrokontrollerrel, pontmátrixos led kijelzővel. A bajom, hogy tűző napsütésben a kijelző halvány. Nálam 1 oszlop vezérlési ideje 1ms (eddig világít egy oszlopon belül a megfelelő sorhoz tartozó led), majd következik a következő oszlop. Így, mivel 5 oszlopom van, az idő 20%-ában világít, 80%-ban sötét egy oszlop. Kérdésem, hogy ha Max7219-el vezérlem a kijelzőt, és beállítom benne, hogy 5 szegmensem van (5*7-es kijelző), nagyobb lesz a fényerőm? Vagy,csakis a nagyobb fényerejű pontmátrixos kijelző lehet megoldás? Van valakinek erről bármi nemű tapasztalata?
(#) Bakman válasza DJozso hozzászólására (») Okt 13, 2018 / 1
 
Egy kedves ismerősöm éppen ilyen problémával szembesült. Kipróbáltuk a Nextion kijelzőket, sokkal jobban láthatóak napsütésben mint bármilyen LED-es kijelző. Fekete háttér, fehér karakter(ek).
(#) sonajkniz hozzászólása Okt 13, 2018 /
 
Sziasztok!
Tudja valaki, hogyan kell beállítani a PK3-at ahhoz, hogy programmódosításkor ne törölje az EEPROM-ot?
A mellékelt képen lévő beállításon bármit módosítok, nem tölti fel a programot, hanem hibát jelez, illetve olyat is szokott csinálni, hogy látszatra minden oké, csak utána a PIC nem csinál semmit.
A hozzászólás módosítva: Okt 13, 2018

Névtelen.jpg
    
(#) DJozso válasza Bakman hozzászólására (») Okt 13, 2018 /
 
Köszi az infót. Én is gondolkodtam nextionon, csak a helyhiány miatt nekem a legkisebb is nagy lenne. Ezért gondoltam az egyszínű OLED kijelzőre. Azzal is lehet jó szerinted? Azokból van elég kicsi is... Úgyis csak egy szám lenne rajta. Mit gondolsz?
(#) Bakman válasza DJozso hozzászólására (») Okt 13, 2018 / 1
 
Az is kontrasztosabb, mint a LED kijelző. Van, amelyiknek csak két lábas vezérlés kell, I2C alapú.
(#) DJozso válasza Bakman hozzászólására (») Okt 13, 2018 /
 
Köszi. Akkor szerintem az oled kijelző lesz a 2.0 fokozat kijelzőm alapja...
(#) Hp41C válasza don_peter hozzászólására (») Okt 13, 2018 /
 
Mekkora pontossággal kellene mérni a feszültséget?
Aluáteresztő szűrő
(#) don_peter válasza Hp41C hozzászólására (») Okt 14, 2018 /
 
Tized pontossággal.
(#) Hp41C válasza don_peter hozzászólására (») Okt 14, 2018 /
 
Elsőfokú aluláteresztő szűrő frekveniája kb. 50 .. 80 Hz legyen.
(#) jocka0012 hozzászólása Okt 14, 2018 /
 
Üdv!
Az lenne a kérdésem , hogy van egy nyomógomb egy dspic33fj16mc102 RB3-as port lábára kötve.A nyomógomb pergésmentesítve van(lehúzó ellenállás 15k + 100nf kondenzátor a nyomógombbal párhuzamosan)és valamiért ha megnyomom akkor 2.2V jelenik meg amit a pic néha logikai 1-nek néha logikai 0-nak érzékel.A port láb bemenetnek van állítva, analóg funkciók ki vannak kapcsolva.Mellékelek egy logikai analizátoros képet is a nyomógomb kimenetéről.Amikor lehúzom a portlábról a nyomógombot és úgy nézem a jelet logikai analizátorral , akkor teljesen jó négyszögjel jelenik meg.
(#) icserny válasza jocka0012 hozzászólására (») Okt 14, 2018 /
 
Remélem, felhúzóellenállás is van...

Abban a bekötésben, ami a honlapomon a PICKWIK projekt Pergésmentesítés c. szakaszában látható, a lehúzó ellenállás a felhúzónak legfeljebb az egytizede legyen. Pl. 10 k felhúzó, 1 k lehúzó. A kondenzátor pl. 470 nF lehet.
(#) jocka0012 válasza icserny hozzászólására (») Okt 14, 2018 /
 
Így van most mint a képen.

pulldown.JPG
    
(#) Hp41C válasza jocka0012 hozzászólására (») Okt 14, 2018 /
 
Milyen oszcillátor beállítást használsz?
A dspic33fj16mc102 az RB3 láb az oszcillátor kimenete (OSCO / CLKO) is.
(#) norbiv8 válasza sonajkniz hozzászólására (») Okt 14, 2018 /
 
Nézd meg az adatlapon hogy milyen címen van az EEPROM, biztos nem 0-s a kezdőcíme.
(#) sonajkniz válasza norbiv8 hozzászólására (») Okt 14, 2018 /
 
Köszönöm a tippet, de időközben megoldódott.
Miután átváltom manual-ra, hogy ki tudjam jelölni az EEPROM megóvást, ha megvan, utánna vissza kell tenni Allow-ra.
(#) jocka0012 válasza Hp41C hozzászólására (») Okt 15, 2018 /
 
Belső oszcillátort használok , de az oszcillátor kimenet az az RA3 lábon van nem?
(#) usane válasza jocka0012 hozzászólására (») Okt 15, 2018 /
 
Igen, de csak akkor jelenik meg ha a config regiszterben az van beállítva nem pedig IO lábnak.
(#) don_peter válasza sonajkniz hozzászólására (») Okt 15, 2018 /
 
Köszönöm a kódot, át írtam C-re, de sajnos ugyan az a gond mint előtte.
PWM 10%-os kitöltésnél, 1MHz-es PIC órajelnél, 18mintát tud venni két flag közt, és átlagolva 90 ADC az 1018 helyett.
4MHz-nél 22 mintát tud venni és átlagban is kicsit feljebb megy, ADC 112 az 1018 helyett.
8MHz-nél 35 mintát tud venni és átlagolva ADC 202 az 1018 helyett.

Sajnos még mindig nem az igazi a dolog.
Lehet ezt már diszkrét alkatrészek nélkül nem tudom megoldani?
(#) kissi válasza don_peter hozzászólására (») Okt 15, 2018 /
 
Szia!

Végignéztem, de nem világos, hogy mit akarsz mérni !? +/- 12V-os jeled van, ennek az átlagértékét vagy a jel nem tuti, hogy +12V, ill. -12V és azt vagy mit ?!
Ráadásul, ha jól értem, akkor a PWM-et Te adod !?
A hozzászólás módosítva: Okt 15, 2018
(#) usane válasza kissi hozzászólására (») Okt 15, 2018 /
 
Épp én is ezt akartam írni, de megelőztél. Nekem sem világos az egész.
(#) kissi válasza kissi hozzászólására (») Okt 15, 2018 /
 
Idézet:
„+-12v 1KHz-es PWM jelet szeretnék visszamérni, a PIC 1MHz-en dolgozik.
A mérendő 12v-os jel 5v-ra vissza is van ellenáramláson keresztül osztva.
A feladat igazából annyi, hogy folyamatosan 1-5mp-es rendszerességgel mérjek egy aktuális feszültségszintet. A PWM jel ellenállásokkal lenne terhelve és ezt kell figyelnem, hogy mikor milyen a terheltség.”


Akkor ez lenne a feladat !?

Idézet:
„PWM 10%-os kitöltésnél, 1MHz-es PIC órajelnél, 18mintát tud venni két flag közt, és átlagolva 90 ADC az 1018 helyett.
4MHz-nél 22 mintát tud venni és átlagban is kicsit feljebb megy, ADC 112 az 1018 helyett.
8MHz-nél 35 mintát tud venni és átlagolva ADC 202 az 1018 helyett.


A FLAG-ek nem néztem, de remélem az aktív PWM szint kezdetét és végét jelzik...??! Ha azalatt veszel min. 18 mintát ( én inkább 16 -ot vennék!), akkor annak jónak kell lennie, a gond a feldolgozásban lehet valahol !
(#) don_peter válasza kissi hozzászólására (») Okt 15, 2018 /
 
PIC-el készítettem egy 1KHz-es jelet.
Az 1 KHz-es PWM jelet +-12v-ra alakítom, ami szépen megy is és mérhető.
Ezt a +-12v-os jelet egy ellenállással rángatom földre, ilyenkor beesik a feszültség és ezt a beesést kellene nekem figyelnem.
A PIC analóg bemenetére egy feszültség osztón keresztül a +-12v-os jelet beengedem.
A PIC-en 0-5v-os tartományban tudom mérni a 12v-os jelet.
Mind addig, ameddig nincs PWM vagy is fixen van kint 12v, addig a vissza mérés helyes.
Egészen addig ameddig PWM jelet 100% kitöltessél hajtom a vissza mérés szintén helyes.
De ha kiköltést csökkentem, akkor a fentebb leírt adatokat kapom.
Ha a PWM jel terheletlen, akkor a vissza mérésnél független a PWM kiköltéstől a maximális feszültséget kellene mérnem, de 10%-os kitöltés mellett csak alig a tizedét méri vissza.

No és itt van a bajom.
Nekem 10%-nál is 12v-ot kellene vissza mérjen (persze a PIC-en ez csak maximum 5v-ot jelent), ha a PWM terheletlen, ha terhelve van, akkor nyilván ellenállástól függően kevesebb feszültséget kellene mérjek.

Mutatom a kódot hozzá:
Header:
  1. __CONFIG(FCMDIS & IESODIS & SBOREN & PROTECT & PROTECT & MCLRDIS & PWRTEN & WDTDIS & INTIO);
  2. #define _XTAL_FREQ 1000000

Main:
  1. #include <htc.h>                        // 10,12,16-os PIC definiciók
  2. #include <pic16f684.h>          // Mikrokontroller kiválasztása
  3. #include <stdio.h>                      // Alap függvények
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include "header.h"                     // Configurációs beállítások
  7.  
  8. #define LED1    RC0
  9. #define LED2    RC3
  10. #define LED3    RC4
  11. #define PWMJel  RC5                     // PWM jel
  12. #define IDO             2000
  13.  
  14. volatile unsigned long ADC = 0;
  15. volatile unsigned char Count = 0;
  16. volatile unsigned short Time = IDO;
  17.  
  18. // ---------------------------- //
  19. //  Prototípusok                           //
  20. // ---------------------------- //
  21. void init();
  22. void PWMDuty(unsigned short duty);
  23. unsigned int read_ADC(unsigned char channel);
  24.  
  25. // ---------------------------- //
  26. //  Interrupt                               //
  27. // ---------------------------- //
  28. void interrupt ISR(void) {
  29.  
  30.         if(TMR2IF){
  31.                 if(--Time==0){
  32.                         TMR2IF = 0;
  33.                         TMR2IE = 0;
  34.                         ADC = 0;
  35.                         do{
  36.                                 ADC += read_ADC(3);
  37.                                 Count++;
  38.                         }while(!TMR2IF);
  39.                         ADC = ADC / Count;
  40.                         Time = IDO;
  41.                         Count = 0;
  42.                         TMR2IF = 0;
  43.                 }else{
  44.                         TMR2IF = 0;
  45.                 }
  46.         }
  47.  
  48. }
  49.  
  50. void main(void){
  51.         unsigned char i = 0;   
  52.         unsigned char ok = 1;
  53.  
  54.         init();
  55.  
  56.         LED1 = 0;
  57.         LED3 = 0;
  58.         TMR2IE  = 1;                            // Timer2 megszakítás engedélyezése
  59.         TMR2ON  = 1;                            // Timer2 engedélyezése
  60.         CCP1CON = 0x0C;                         // PWM engedélyezése
  61.         PWMDuty(10);                            // %-os érték
  62.         while(1){
  63.  
  64.                 LED1 = 0;
  65.                 LED2 = 0;
  66.                 LED3 = 0;
  67.                 __delay_ms(1000);              
  68.  
  69.                 //ADC = Count;
  70.  
  71.                 if(ADC>100){
  72.                         for(i=0;i<(unsigned int)(ADC/100);i++){
  73.                                 LED1 = 1;
  74.                                 __delay_ms(250);
  75.                                 LED1 = 0;
  76.                                 __delay_ms(250);
  77.                         }
  78.                         ADC = (ADC-((ADC/100)*100));
  79.                 }
  80.                 if(ADC>10){
  81.                         for(i=0;i<(unsigned int)(ADC/10);i++){
  82.                                 LED2 = 1;
  83.                                 __delay_ms(250);
  84.                                 LED2 = 0;
  85.                                 __delay_ms(250);
  86.                         }
  87.                 }
  88.                 if(ADC>1){
  89.                         for(i=0;i<(ADC%10);i++){
  90.                                 LED3 = 1;
  91.                                 __delay_ms(250);
  92.                                 LED3 = 0;
  93.                                 __delay_ms(250);
  94.                         }
  95.                 }
  96.                 //Count=0;
  97.                 if(!TMR2IE) TMR2IE      = 1;
  98.         }
  99.  
  100. }//main
  101.  
  102. // ---------------------------- //
  103. //  Függvények                                    //
  104. // ---------------------------- //
  105. void init(){
  106.  
  107.         TRISC   = 0x00;                         // kimenet
  108.         TRISA   = 0x14;                         // A4, A2 bemenet
  109.         PWMJel  = 1;                            // PWM jel mindig magas, ha inaktív
  110.         ANSEL   = 0b00001000;           // AN3 analog többi láb digitális
  111.         CMCON0  = 7;                            // Comparator kikapcsolva
  112.         PEIE    = 1;                            // Peripheral interrupt engedélyezése
  113.         GIE             = 1;                            // Globális interrupt engedélyezése
  114.         OSCCON  = 0b01000001;           // 1MHz-es belső órajel beállítva
  115.  
  116.         CCP1CON = 0x00;                         // Alap esetben kikapcsolva 0x0C
  117.  
  118.         // 1KHz
  119.  
  120.         // 8MHz
  121.         //PR2           = 0b01111100 ;
  122.         //T2CON         = 0b00000011 ;
  123.         //TMR2IE        = 0;
  124.  
  125.         // 4MHz
  126.         //PR2   = 0b11111001;           // 249
  127.         //T2CON = 0b00000001;           // Alap esetben kikapcsolva, 10-es utóosztó a megszakításnak
  128.         //TMR2IE        = 0;
  129.  
  130.         // 1MHz
  131.         PR2     = 0b11111001;           // 249
  132.         T2CON   = 0b01001000;
  133.         TMR2IE  = 0;
  134.  
  135.         ADCON0  = 0b10001100;           // Right justified, VDD Ref, A3 chanel, A/D enabled
  136.         ADCON1  = 0x00;                         // FOSC/2
  137.         ADON    = 1;                            // AD enabled
  138.        
  139. }

Main függvényben lévő LED-es FOR ciklusokkal debugolok.
A hozzászólás módosítva: Okt 15, 2018
(#) ktamas66 válasza don_peter hozzászólására (») Okt 15, 2018 /
 
Mint fentebb írtam ki kellene számolni (vagy a szimulátorban megnézni) mennyi ideig tart egy mérés. Az 1kHz-es PWM 10%-os kitöltésnél 100us hosszú magas jelet ad. Láthatóan a 18 mérésnek kb. a 10%-a esik erre az időtartamra, a többinél 0 közelit mér, feltételezve, hogy a +12V-os esetén maximumot, -12V esetén 0-át kell mérnie. Ha csak a magasat szeretnéd mérni biztosítani kellene, hogy minden mérés a magas szintre essen és ne csússzon át, ha átlagot akkor arra kellene figyelni, hogy lehetőleg egész periódust mérjél, vagy elég sokat, hogy kicsi legyen a hiba.
(#) kissi válasza don_peter hozzászólására (») Okt 15, 2018 /
 
Ez csak gyors reagálás, de úgy látom, hogy 2 TMR2 jelzés között mérsz ! Azalatt a PWM teljes periódusa lefut, azaz, ha méred az amplitúdóját, akkor átlagosan pont a tizedét kell kapnod !
(#) kissi válasza kissi hozzászólására (») Okt 15, 2018 /
 
Csak addig mérj és átlagolj, amíg a PWM POZITÍV része van !
A hozzászólás módosítva: Okt 15, 2018
(#) don_peter válasza kissi hozzászólására (») Okt 15, 2018 /
 
És ezt miképpen?
Tegyek be egy if-et, hogy ha nagyobb mint nulla akkor mérem, és ha nulla akkor eldobom?
Vagy csak szimplán az átlagolásnál az osztásokba a nullák mérése ne kerüljenek bele?
És úgy néz ki elsőre, hogy ez működik is.
A hozzászólás módosítva: Okt 15, 2018
Következő: »»   1050 / 1203
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem