|
|
|
||||||||
| Arcade | Registrazione | Blogs | Regolamento | Feedback | FAQ | Lista Utenti | Calendario | Segna come Letti |
| Ultimi 5 blog pubblicati su PcTuner Blog | ||||||
|
||||||
![]() |
|
|
Strumenti Discussione | Modalità Visualizzazione |
|
|
#1 |
|
Registered User
|
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.
il compilatore è mikrobasic. dove sto sbagliando??? |
|
|
|
|
|
#2 |
|
Tuned Moderator
|
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...
__________________ |
|
|
|
|
|
#3 |
|
Registered User
|
è 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?? |
|
|
|
|
|
#4 |
|
Tuned Moderator
|
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. |
|
|
|
|
|
#7 | |
|
Registered User
|
Quote:
|
|
|
|
|
![]() |
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 | |
|
|