Vai Indietro   PcTuner Forum > Sezione Hardware > Programmazione PIC
Arcade Registrazione Blogs Regolamento Feedback FAQ Lista Utenti Calendario Segna come Letti

Ultimi 5 blog pubblicati su PcTuner Blog
Data Titolo

Rispondi
 
Strumenti Discussione Modalità Visualizzazione
Vecchio 12-04-2009, 02.16.59   #1
Registered User
 

Iscritto da: 19-03-2009
Messaggi: 39
Feedback: (0)
problema visualizzazione %PWM su lcd

salve a tutti.
sto scrivendo un piccolo software che mi varia la velocita di un motorino vcc con un potenziometro e con la possibilita di visualizzare su un lcd 2x16 il valore percentuale (0-100%)
premetto che la variazione di velocita funziona, funziona anche la visualizzazione del valore scalato, ma se li inserisco nello stesso programma il motore non gira piu.
Codice:
program pwm
dim k as byte
dim t_on as byte
dim t_off as byte
dim res as word
dim adc as word
dim tlong as longint
dim ch as byte
main:
TRISD = 0xFF
PORTD = 0
TRISC = 0x00
PORTC = 0
  INTCON = 0
  Lcd_Config(PORTB,3,2,1,0,PORTB,4,7,5)
  Lcd_Cmd( LCD_CURSOR_OFF)
  Lcd_Cmd(LCD_CLEAR)
  Lcd_Out(1,1, "PWM MOTORE D.C.")
  OPTION_REG = $80
  ADCON1     = $82
  TRISA      = $FF
k = 0
t_on = 0
t_off = 100
while true
   res     = ADC_read(2)
   tlong = res*10000            
   res = tlong>>10              
   ch = res div 1000            
   Lcd_Chr(2,9, 48+ch)         
   ch = (res div 100) mod 10    
   Lcd_Chr(2,10, 48+ch)        
   Lcd_Chr(2,11, ",")          
   ch = (res div 10) mod 10     
    Lcd_Chr(2,13, "%")          
     if ((res>=0) and (res<100)) then
    t_on= 14
    t_off= 86
    end if
   if ((res>=101) and (res<=200)) then
    t_on= 26
    t_off= 74
    end if
   if ((res>=201) and (res<=400)) then
     t_on= 38
     t_off= 62
     end if
     if ((res>=401) and (res<=600)) then
     t_on= 50
     t_off= 50
     end if
    if ((res>=601) and (res<=700)) then
    t_on= 62
    t_off=38
    end if
    if ((res>=701) and (res<=800)) then
     t_on= 74
     t_off= 26
     end if
    if ((res>=801) and (res<=900)) then
     t_on= 86
     t_off= 14
     end if
    if ((res>=9) and (res<=100)) then
    t_on= 100
    t_off= 0
    end if
PORTC.2= 1
for k=1 to t_on
Delay_us(1)
next k
PORTC.2= 0
for k=1 to t_off
Delay_us(1)
next k
wend
end.
se inserisco la parta di programma in rosso il motore non gira piu ma mi la visualizzazione sul display funziona.
il compilatore è mikrobasic.
dove sto sbagliando???
drake Non in Linea   Rispondi Citando
Vecchio 12-04-2009, 18.06.38   #2
Tuned Moderator
 
L'avatar di  naimah
 

Iscritto da: 21-08-2006
Locazione: Pistoia
Messaggi: 1,761
Feedback: (1)
Ma scusa... Hai messo la parte di invio dei caratteri all'LCD in serie al codice per la generazione degli impulsi: così facendo, il t_off avrà una durata data dal valore impostato più il tempo che il codice impiega per inviare i caratteri all'LCD più il tempo che occorre per eseguire tutte le comparazioni. Concettualmente poi, la generazione del PWM è inutilmente complessa: potevi semplicemente utilizzare 2 variabili, una per gestire il periodo complessivo e una per gestire il duty positivo sfruttando gli interrupt...
__________________
naimah Non in Linea   Rispondi Citando
Vecchio 12-04-2009, 18.27.49   #3
Registered User
 

Iscritto da: 19-03-2009
Messaggi: 39
Feedback: (0)
è da poco che uso il basic e che programmo i pic, quindi ho preso spunto da un progetto trovato in un libro e volevo aggiungere il valore sul display.
la parte di software per l'invio di caratteri al display come deve essere impostata??
drake Non in Linea   Rispondi Citando
Vecchio 12-04-2009, 19.25.00   #4
Tuned Moderator
 
L'avatar di  naimah
 

Iscritto da: 21-08-2006
Locazione: Pistoia
Messaggi: 1,761
Feedback: (1)
Ripeto, devi gestire diversamente. Nella tua applicazione vi è una parte suscettibile al tempo ciclo, ovvero la generazione del segnale PWM. E' chiaro che introdurla nel ciclo main è errato, poichè tutte le altre istruzioni di contorno introducono ritardi tali da modificare le caratteristiche del segnale che vuoi generare. Ergo, è necessario gestire la generazione del PWM attraverso l'interrupt. Per fare questo ci sono svariate soluzioni e sul forum puoi trovare molti esempi.

Non hai ancora detto quale micro utilizzi: molti dispongono del PWM hardware, il che renderebbe il tutto molto più semplice. Per quanto riguarda mikroBasic, non utilizzandolo posso essere di poco aiuto. Ma, come già detto, sul forum puoi trovare molti esempi.
__________________
naimah Non in Linea   Rispondi Citando
Vecchio 12-04-2009, 22.42.45   #5
Registered User
 

Iscritto da: 19-03-2009
Messaggi: 39
Feedback: (0)
ok razie, ora provo come dici tu. il pic è 16f877a
drake Non in Linea   Rispondi Citando
Vecchio 12-04-2009, 22.53.00   #6
Registered User
 

Iscritto da: 26-03-2008
Locazione: Parma GialloBlù
Messaggi: 13
Feedback: (0)
il 16f877a ha il modulo pwm hardware...usarlo semplificherebbe di molto il tutto
Pappe Non in Linea   Rispondi Citando
Vecchio 12-04-2009, 23.22.42   #7
Registered User
 

Iscritto da: 19-03-2009
Messaggi: 39
Feedback: (0)
Quote:
program PWM_Test_01
dim res as word
dim mio as word
dim tlong as longint
dim ch as byte
main:
TRISC = $FF
INTCON = 0
Lcd_Config(PORTB,3,2,1,0,PORTB,4,7,5)
Lcd_Cmd( LCD_CURSOR_OFF)
Lcd_Cmd(LCD_CLEAR)
Lcd_Out(1,1, "PWM MOTORE D.C.")
OPTION_REG = $80
OPTION_REG = $80
ADCON1 = $82
TRISA = $FF
Pwm_Init(500)
Pwm_Start

while true
res = ADC_read(2)
mio = res div 4
Pwm_Change_Duty(mio)
tlong = res*10000
res = tlong>>10
ch = res div 1000
Lcd_Chr(2,9, 48+ch)
ch = (res div 100) mod 10
Lcd_Chr(2,10, 48+ch)
Lcd_Chr(2,11, ",")
ch = (res div 10) mod 10
Lcd_Chr(2,12, ch+48)
Lcd_Chr(2,13, "%")
wend
end.
risolto in questo modo, devo solo affinare alcune cosette
drake Non in Linea   Rispondi Citando
Rispondi Per le vostre immagini su questo forum potete usare PcTunerUp!
Iscriviti gratuitamente alla nostra newsletter.


Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 visitatori)
 
Strumenti Discussione
Modalità Visualizzazione

Regole di scrittura
non Puoi inserire messaggi
non Puoi rispondere ai messaggi
non Puoi inviare allegati
non Puoi modificare i tuoi messaggi

codice vB è Attivo
Smilies è Attivo
[IMG] il codice è Attivo
Il codice HTML è Disattivato
Trackbacks are Disattivato
Pingbacks are Disattivato
Refbacks are Disattivato
Vai al Forum


Tutti gli Orari sono GMT +2. Attualmente sono le 10.50.59.


Powered by vBulletin Versione 3.6.12
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0
Copyright © 2010 - Master New Media S.r.l. a socio unico - P.I. 02947530784. Tutti i diritti di proprietà letteraria e artistica sono riservati- Privacy
www.pctuner.net è testata telematica registrata presso il Tribunale di Torino, n. 39 del 07.05.2008, Editore Master New Media S.r.l.