Вы находитесь на странице: 1из 9

27/10/2015

TutorialesPIC:ControldemltiplesservosconunnicoTIMER.

TutorialesPIC
FundamentosdemicrocontroladoresaplicadosalafamiliaPICdeMicrochip.ProyectosyAplicaciones.

Seleccionaridioma
Conlatecnologade

Traductor

VIERNES,29DENOVIEMBREDE2013

ControldemltiplesservosconunnicoTIMER.

PGINASVISTASENTOTAL

398,275
SEARCHINTHISBLOG

Enestaentradavamosavercomoconectarnuestromicrocontroladorcon
otrodispositivomuypopular,unservomotor.Unservomotoresunmotor
DC,similaralosusadosenlasentradasquededicamosalcontrolde
motores.Sinembargo,alcontrarioquelosmotoresquemanejamosall,los
servomotoresincluyensupropiohardwaredecontrol,porloqueno
tendremosquepreocuparnosdeesaparte.
Enlaprimerapartedeestaentradadescribiremoslosfundamentosde
cmocontrolarunservoconunmicrocontrolador,conunamnima
sobrecargaparaelPICmedianteelusodeuntimerysusinterrupcin
asociada.
Enlasegundaparteextenderemosesteenfoqueparaelcasodequenecesitemoscontrolarmuchos
servosconunnicoPIC.Veremoscomopodemoscontrolarhasta8/10servosdedicandosloun
TIMERdelmicrocontrolador.

Buscar

LOMSVISTOESTEMES

ModulacinPWM(Pulse
WidthModulation)
ConversorADC
Interrupciones(conceptos
bsicos)
ManejodemotoresDC
usandoPWM
Usodetemporizadores
(timers)

Archivosdecdigoasociadosaestaentrada:servo_calib.cyservo_n.c

PROYECTOS:

AudioconPWM
Brjulaelectrnica
Levitadormagntico

Hardware:

Medidordepotencia

Comohemoscomentado,unservo(verfiguraadjunta)esunsimplemotorDCconsupropiaelectrnica
decontrol.Normalmenteelparmetrocontroladoeslaposicin:unaordennuestrahacequeelservo
vayahastaunaciertaposicinypermanezcaenella.
Aunquemenoscomunes,podemosencontrarnosservoscuyoparmetrocontroladoeslavelocidad.En
estecaso,nuestrasordenescausanqueelservogireuniformementealavelocidadindicada.
Enestaentradanoscentraremosenlosservosdeposicin.Tpicamente
constandeunmotorDCnormalconunagranreductoraentreelejedel
motoryelejedesalida.Aesteejedesalidaestconectadoalgntipode
sensor(normalmenteunpotencimetro)atravsdecuyamedidaelservo
conocequehallegadoalaposicindeseadaypuededetenerelmotor.
Lamayoradelosservosestnlimitadosamoversedentrodeunafraccin
devuelta,porloqueenvezdeposicioneshablaremosdelngulodelservo.
Unparmetroimportantedeunservoeselrangomximoquepuedegirar
("throw"eningles).Astendremosservosdemediavuelta(180),una
vueltacompleta(360)oinclusouncuarto(90)devuelta.
Losservosdemediavuelta,conunrangomximode180,sonmuycomunesyenellosbasarla
explicacindelosconceptosbsicos.
Unservosuelecontarcon3hilos.Dosdeellos,tpicamenterojo(V+)ynegro(GND),leproporcionanla
alimentacinrequerida,ascomounniveldereferenciacomn(masa)conelmicro.Eltercerhilo
(naranjaesunaopcinmuyusadaparaestehilo)eselqueelmicrousarparacontrol,esdecir,para
decirlealservoaqueposicin(ngulo)debegirar.

Monitorpulsocardaco
ARCHIVODELBLOG

2013(16)
noviembre(1)
Controldemltiples
servosconunnico
TIMER.
septiembre(1)
agosto(1)
julio(2)
junio(3)
abril(4)
febrero(4)
2012(13)

DATOSPERSONALES

Antonio
Vertodomiperfil
SEGUIDORES

Laformadeenviaresainformacinenmuysencilla.Tcnicamentesedenominamodulacinporanchode
pulsoyconsisteenqueelPICdebemandarunaseriedepulsosalservoconunafrecuenciaconstante
(delordende50Hz).Laseparacinentrepulsosporlotantoessiempredeunos20msec.Lasordenes
selasdamosatravsdelanchodelospulsos,quesueleoscilarentre1y2milisegundos.
Enlafiguraadjuntapodemosvergrficamenteestasituacin:

http://picfernalia.blogspot.nl/2013/11/controldemultiplesservosconun.html

1/9

27/10/2015

TutorialesPIC:ControldemltiplesservosconunnicoTIMER.
Participarenestesitio
GoogleFriendConnect

Miembros(35) Ms

Yaeresmiembro?Iniciarsesin

Elcasoilustradocorrespondeaunservoconunrangodevueltao180.Unanchodelpulsode1.5
milisegundosledicealservoquedebeirasuposicincentraloneutra.Siacortamosoalargamosel
pulsogiraremosalaizquierdaoaladerecha.Enelejemplomostradoelservoalcanzasusextremos(0y
180)para1y2milisegundos.
Comoseobserva,independientementedelanchodelospulsos,laseparacinentrepulsosesconstantey
debeserdelordende20milisegundos,loquecorrespondealafrecuenciaantesmencionadade50Hz.
Estafrecuencianoescrtica:frecuenciasentre40y65Hzfuncionarnposiblemente(periodosentre15
25msec).
Esimportanteresaltarquelosvaloresanterioressonaproximadosydebenconsiderarseunpuntode
partida.
Esfundamentalnosobrepasarlosvaloresmximoymnimo,porqueelservointentarirmsallysus
"topes"seloimpedirn.Elresultado,dependiendodelafuerzadelservoylacalidaddelosengranajes
podraserunservoquemadooconsusengranajes"pulidos"(sobretodosisondeplstico,comoocurre
enmuchosservosbaratos).
Debidoaesto,esmuyimportanteverificarlosservosconlosquevamosatrabajarantesdeusarlosen
nuestraaplicacin.Paraellopodemosirincrementando/decrementandoelanchodelpulsohasta
encontrarsuslmites.Elpuntodepartidaserlaposicinneutra"nominal":unanchode1.5msec.Puede
quenocorrespondaalpuntocentralexactamenteperoseguroquecaeenlazonapermitida.
Elsiguienteesquemareflejalasconexionesentreelmicroyelservo.Elhilo
decontrol(naranja?)seconectadirectamenteacualquierpin(modosalida
digital)delPIC.EnnuestroprimerejemplohemosusadoRC0,perocualquier
otrovaldra.Losotrosdoshilosdelservoseconectanalaalimentacin
(rojo?)yamasa(negro/marrn?).

RecalcarqueesnecesarioquelamasadelPICyladelservoestn
conectadasparaquetenganunareferenciacomndevoltaje.
Respectoalvoltajedealimentacinparaelservohabrqueconsultarlasespecificaciones,peromuchos
deellosfuncionarnrazonablementeconunaalimentacinentre4y8V.Sinosquedamoscortoslonico
quepuedepasaresqueelservonosemuevaogiremslentamente.
Como 5V es un voltaje adecuado para muchos servos podramos estar tentados de usar la misma
alimentacinparaelservoyelPIC.Estoesunamalaidea,yaquelasdemandasdecorrientedelservoal
moversepuedenhacercaerelvoltajedelaalimentacin,conelconsiguienteriesgodereseteodelPIC.

EnmimontajeusolaplacaEasyPIC,alimentadaatravsdelUSB(5V)delordenador.
Sinembargo,usootrabateraindependiente(7V)paraalimentaralservo.
Finalmente,enelprogramausaremosunpardepulsadores(conectadosaRA1yRA2)
paravariarelanchodelpulso(yporlotantomoverelservo).Vemosenelesquema
adjuntocmocadapinestatadoatierraconunaresistenciadepulldown.Su
estadonaturalesLOW(0).Sloalpulsarpasanaunnivelalto.

http://picfernalia.blogspot.nl/2013/11/controldemultiplesservosconun.html

2/9

27/10/2015

TutorialesPIC:ControldemltiplesservosconunnicoTIMER.

Software:
Nuestroprincipalobjetivoesprogramarunasealde50Hzconunanchodepulsoquepodamosvariaren
elrangoindicado.
Loprimeroquepodemospensaresquelasealesperadaporelservo(periodofijo,anchodelpulsi
variable)separecemuchoaunasealPWM.Dehechoesoesexactamenteloquees(anteslahemos
llamadocodificacinporanchodepulso,peroesoeninglsesjustamentePWM,PulseWidthModulation).
NuestraprimeraideaserausarunalneaPWMparacontrolarunservo.Setrataradeconseguiruna
frecuenciaPWMdelordende50Hzyvariarelanchodelpulsoconelduty_cicle.Estoesfactible,peroen
miopinin,noesunabuenaideaporvariasrazones:
1.LaslneasPWMsonescasas(tpicamenteslo2enunPIC).Qupasasiqueremoscontrolarms
servos?Adems,laslneasPWMtienenotrasfunciones(mododeCAPTUREoCOMPARE)ypueden
noestardisponibles.
2.Aunquenohubieseproblemasdedisponibilidad,lascaractersticasdelPWMdeunPICnose
prestanasuusocomocontroldeunservo.Veamoslasrazones.
SirecordamoslaentradadeintroduccinalPWMlafrecuenciaPWMquepuedeobtenerseparaunacierta
frecuenciadelosciladores:
Fpwm(mnima)=Fosc/16384
Parapoderllegaralafrecuenciadeseadade50Hzdeberamosbajaraunosciladorde1MHzomenor,lo
queposiblementehagamuylentoelsistemaparaotrastareas.
AdemsPWMestdiseadoparavariarelciclodetrabajo(%on)entre0y100%.Encambio,para
controlarunservoeltiempoon(anchodelpulso)oscilacomohemosvistoentre1y2msecdentrodel
periodode20msec.Traducidoaciclodetrabajocorresponderaamovernosentreun5%(1/20)yun
10%(2/20).Perderemosmucha"resolucin"siestamoslimitadosaunintervalotanpequeo.
EnvezdeusarelmduloPWMesmuchomejorusarunsimpleTIMER(ysucorrespondienteinterrupcin)
paracrearlasealdecontrol.Senospuedecriticarqueestamoscambiandounrecurso(PWM)porotro
(TIMER)peroesonoseracorrecto,yaqueusarelPWMconllevatambinelgastodeltimerasociado
(TMR2).
Otraposiblecrticaesquesinecesitamoscontrolarmuchosservossenosacabarnlostimers.Lobueno
deesteenfoqueesque,comoexplicaremosenestaentrada,podemoscontrolarhasta8servosconun
nicotimer(elnmeroexactodependedelascaractersticasdelosservosusados,podranseralguno
msomenos).
Enestaentradaveremosdosprogramas:enelprimeropresentaremoslosfundamentosdelainterfazcon
elservousandountimer.Enelsegundoampliaremoselconceptoalusodemltiplesservossinque
necesitemosmsrecursosdelPIC.

PROGRAMA1(servo_calib.c):
IlustrarlosconceptosbsicossobrecomoconfigurarunTIMERparagenerarlasealdecontrolsin
apenassobrecargaparaelPIC.Usaremosunpardepulsadoresparaaumentar/reducirelanchodelpulso.
Esteprogramatambinpuedeservirnoscomocalibracindeunservocuyasespecificacionesdetalladas
desconozcamos.Podemospartirdeunanchomedio(1500msec)correspondientealaposicinneutraeir
subiendo/bajandohastanotar(chirridos,vibraciones)quehemosalcanzadoeltope.Deestaforma
podemosobtenerelanchomnimoymximodelpulsoparaeseservoysuposicinneutra.Nosvendr
bienademsparaverificarelverdaderorangodelservo(sumovimientoengrados).Esfciladquirir
servosbaratossupuestamenteconunrangode180,cuyoverdaderorangoestmscercadede
vuelta(90).

Elprogramaesmuysencillo.Veamoselcdigodelarutinaprincipal.
voidmain()
{
T0CON=0b00000000
enable_global_intsenable_TMR0_int
start_TMR0

ADCON1=0x0F//NoPORTSusedasAD
TRISA=0b00000110//RA1,RA2inputs
TRISB=0PORTB=0TRISC=0PORTC=0TRISD=0PORTD=0//Allpinsdownto0

http://picfernalia.blogspot.nl/2013/11/controldemultiplesservosconun.html

3/9

27/10/2015

TutorialesPIC:ControldemltiplesservosconunnicoTIMER.

while(1)
{
if(PORTAbits.RA1==1)if(pulse<2100)pulse++//Incrementspulse(max2.1msec)
if(PORTAbits.RA2==1)if(pulse>500)pulse//Decrementspulse(min0.5msec)
PORTB=pulse/10//ShowcurrentpulseinPORTB
Delay10TCYx(100)//Waitawhile
}
}
Algunoscomentarios:
Lainicializacina0deT0CONponealtimerTMR0enmodode16bits,contandociclosde
instruccinyconunprescaler1:2.Enesteproyectoestoyusandouncristalde8MHz,porlo
quelafrecuenciadeinstruccinesdeFosc/4=2MHz.Conunpreescaler1:2hagoqueel
contadordelTMR0seincrementecadamicrosegundo,loqueresultamuyconvenientepara
"traducir"losdelayprogramados.
HabilitamoslasinterrupcionesglobalesylainterrupcinasociadaaTMR0.
Usaremostodoslospinescomodeentrada/salidadigital(ADCON1=0x0F)
DeclaramosRA1yRA2entradas(bitscorrespondientesdeTRISA=1).

PreviamentehemosdeclaradounpardemacrosparaarrancareltimerTMR0yreseterasucontador(16
bits):
#defineset_TMR0(x){TMR0H=(x>>8)TMR0L=(x&0x00FF)}
#definestart_TMR0T0CONbits.TMR0ON=1

Elrestodelmain()essimplementeunbucleinfinitodondemonitorizamossisehanpulsadolos
pulsadoresasociadosaRA1yRA2.Siesasseincrementaodecrementalavariablepulse(uint16)que
gobernarelanchodelpulsodecontrol.Elvalordedichavariablepuedevariarentre0.5y2.1
milisegundos,quesonlosextremosquehedetectadoparaelservousado.
EvidentementetodalaaccinsucededurantelainterrupcindelTMR0.Veamossucdigo:
#defineSERVO_LINELATCbits.LATC0
uint16TMR0_ini,pulse=1325//inmicrosec

//Highpriorityinterruption
#pragmainterrupthigh_ISR
voidhigh_ISR(void)
{
if(TMR0_flag)//ISRdelainterrupciondeTMR0
{
SERVO_LINE=1SERVO_LINE
if(SERVO_LINE)TMR0_ini=25pulse//65536(pulse25)
elseTMR0_ini=45536+pulse+25//65536(20000(pulse25))
set_TMR0(TMR0_ini)
TMR0_flag=0
}
}

Coneldefine#SERVO_LINEindicoquepinvoyausarparacontrolarelservo.Enestecasoes
RC0.
Declarolavariablepulse(uint16)queguardarelanchodelpulsodeseado,ylainicializocon
1325,quecorrespondea1.325milisegundos(queresultaserlaposicinneutrademiservo).
Examinemosahoraconmsdetalleelcdigodelainterrupcin:
1.Loprimeroquehacemosescambiarelestadodelalnea.Siestababajaselevantayviceversa.
2.Silalneaestalta(traslaoperacinanterior)esqueestamosenlafasedelpulso,quedebedurar
elanchodelpulso(valordepulseenmicrosegundos).ComoloscontadoresdelostimersenlosPIC
seincrementansiempreylainterrupcinseproduciralllegara65536,deboprogramarunvalor
nominalinicialparaTMR0:

TMR0_ini=65536pulse

http://picfernalia.blogspot.nl/2013/11/controldemultiplesservosconun.html

4/9

27/10/2015

TutorialesPIC:ControldemltiplesservosconunnicoTIMER.

paraquepasadospulsemicrosegundosreboseelcontadoryseproduzcalasiguienteinterrupcin
(dondesecambiarelestadodelalnea,acabndoseelpulso.

Sinembargo,debidoalosretrasosintroducidosenlallamadaalainterrupcinyalosclculosprevios
hecomprobadoqueesmsexactoinicializarelcontadorunpocomsadelantedesuvalor
nominal.Enparticular,unacorreccinde25ciclosesmuyadecuada:
TMR0_ini=65536pulse+25=(paraunuint16)=25pulse
yeseeselvalorqueintroduzcoenlavariableTMR0_ini.
3.Sitraselcambiolalneaestabajaesqueestamosenlafasede"descanso"hastaelsiguiente
pulso.Laduracindeesafaseserde20msecancho_pulso=20000pulse.Inicializaremos
TMR0_iniconsu
complementario:
TMR0_ini=6553620000+pulse=45536+pulse.
Aligualqueantesparacompensarretrasosenlaejecucinpodemosadelantarunpocodicho
contador.Siintroducimoslamismacorreccindeantestendremos:
TMR0_ini=45536+pulse+25
4.TrashacerlosclculosanteriorespongoenhoraelcontadorTMR0conset_TMR0(TMR0_ini).

Yyaesttodo.Lainterrupcinsaltaralternadamentecadapulse(enmsec)ycada20pulse(msec).
Trselintervalolargo(20pulso)sesubirlalneaytraselcorto(pulse)sebajar,obtenindoseasla
sealdecontroldeseada.
Comopulseesunavariablepuedecambiarseencualquiermomento(ennuestrocasoatravsdelos
pulsadoresenelbucleprincipal)modificandoelanchodelpulsoylaposicindelservo.

EnelvideoadjuntosemuestraelresultadocuandoconectamosRC0alalneadecontroldeunservo:

Unavezentendidoslosfundamentosparacontrolarunservo,ampliaremoselconceptoalcasodequerer
gobernarmltiplesservos.

PROGRAMA2(servo_n.c)
EnestesegundoejemploilustraremoscomousarmltiplesservosconunnicoTIMERdelPIC.
Ademsdelusoideuntimernecesitaremos(enprincipio)8lneasdecontrol,unaparacadaservo.Sin
embargoveremosqueconesteenfoqueencadainstanteslotenemosactivaunalneadeunservo,por
loqueseraposibleusarundemultiplexador(tipo74HC237)paragobernar8servosconslo3pinesdel
PIC.Enestecdigonosehausadoestaopcinperoserafcildeadaptar.
Podemoscontrolarvariosservossinusartimersadicionalesporqueeltiempoquecadaservoestaalto
(12msec)esmuypequeocomparadoconelperiodo(20msec).Laideaesaprovechareltiempoen
quelalneadeunservoestbajaparadedicarnosalrestodelosservos.
Veamoselcdigo,queestescritosuponiendo5servosacontrolar,aunqueesfcilmentemodificable
parapotronmero.Empezaremosconladeclaracindelosdefinesyvariablesglobalesausar:

#defineN_SERVO5
#defineSERVO_0LATCbits.LATC0

http://picfernalia.blogspot.nl/2013/11/controldemultiplesservosconun.html

5/9

27/10/2015

TutorialesPIC:ControldemltiplesservosconunnicoTIMER.

#defineSERVO_1LATCbits.LATC1
#defineSERVO_2LATCbits.LATC2
#defineSERVO_3LATCbits.LATC3
#defineSERVO_4LATCbits.LATC4
uint8servo_active=0
uint16pulse[N_SERVO]={600,900,1200,1500,1800}//inmicrosec
uint16TMR0_ini

Muysimilaralcasoanterior,soloqueahoratenemos5servos(N_SERVO)acontrolar,porloque
tenemosquedeclararno1sino5pinesdecontrol,desdeRC0aRC4.
Tenemosquetenertambinunanuevavariable(servo_activo)quenosindicardequeservoseest
ocupandoeltimer.
FinalmentetenemosnuestrasconocidasvariablesTMR0_iniypulse,soloqueahorapulseesunarrayde
tamao5,yaquetenemos5servosycadaunopuedetenerunanchodepulso(poscin)diferente.Los
pulsosparaloscincoservosseinicializana0.6,0.9,1.2,1.5y1.8msec.
Dentrodelafuncinmain()tenemosunsistemaparecidoalanteriorparapodercambiarlosanchosde
lospulsos:

ADCON1=0x0F//NoPORTSusedasAD
TRISA=0b00000111
while(1)
{
if(PORTAbits.RA0==1){k++if(k==N_SERVO)k=0PORTB=k}
if(PORTAbits.RA1==1)if(pulse[k]<2100)pulse[k]++
if(PORTAbits.RA2==1)if(pulse[k]>500)pulse[k]
Delay10TCYx(100)
}

AdemsdelospulsadoresRA1yRA2deantesparacambiareltamaodeunpulso,tengoqueteneruna
variable(k,inicializadaa0)quemeindicaculdelosservosestoymodificando.Dichavariablecambiaal
pulsarRA0,porloquepuedomodificarelanchodepulsodecualquieradelassealesdecontrol.Para
saberquservoestoymodificandoelprogramamemuestraelvaloractualdekenPORTB.
Yasloquedaverelcdigodelainterrupcindondesehaceeltrabajo:

#defineslot(20000/N_SERVO)//Timeslotallocatedtoeachservo
#definec_slot(65536slot+30)//Complementary(16bits)ofc_slot

//Highpriorityinterruption
#pragmainterrupthigh_ISR
voidhigh_ISR(void)
{
PORTDbits.RD0=1
if(TMR0_flag)//ISRdelainterrupciondeTMR1
{
switch(servo_active)
{
case0:
SERVO_0=1SERVO_0//ChangesstatesofSERVO_0
//ifHIGHprogrampulse[0]delay,else//else(slotpulse[0])delay
if(SERVO_0)TMR0_ini=25pulse[0]
else{TMR0_ini=c_slot+pulse[0]servo_active++}
break
case1:
SERVO_1=1SERVO_1
if(SERVO_1)TMR0_ini=25pulse[1]
else{TMR0_ini=c_slot+pulse[1]servo_active++}
break
case2:
SERVO_2=1SERVO_2
if(SERVO_2)TMR0_ini=25pulse[2]
else{TMR0_ini=c_slot+pulse[2]servo_active++}
break

http://picfernalia.blogspot.nl/2013/11/controldemultiplesservosconun.html

6/9

27/10/2015

TutorialesPIC:ControldemltiplesservosconunnicoTIMER.

case3:
SERVO_3=1SERVO_3
if(SERVO_3)TMR0_ini=25pulse[3]
else{TMR0_ini=c_slot+pulse[3]servo_active++}
break
case4:
SERVO_4=1SERVO_4
if(SERVO_4)TMR0_ini=25pulse[4]
else{TMR0_ini=c_slot+pulse[4]servo_active=0}
break
}
set_TMR0(TMR0_ini)
TMR0_flag=0
}
PORTDbits.RD0=0
}
Atravsdeservo_activepodemosverqueservoest"activo".Dentrodecadaservo,elcdigoesmuy
similaraldeantes:
SERVO_0=1SERVO_0//ChangesstatesofSERVO_0
//ifHIGHprogramdelay=pulse[0]else=(slotpulse[0])
if(SERVO_0)TMR0_ini=25pulse[0]
else{TMR0_ini=c_slot+pulse[0]servo_active++}
break
Comoantescambiamoselestadodelalnea.Sitraselcambioestaltaesqueestamosenelperiododel
pulsoyprogramamoseltimerparaquesaltedentrodepulse[0]microsegundos.
Ladiferenciaesqueahora,silalneaestbajaenvezdeesperar20msec(pulso),esperamos20
msec/5(pulso).Esloqueenelprogramadefinocomounslot.LaideaesqueahoralosNservosdeben
repartirselos20milisegundosdelosquedisponemos,porloquecadaunoslocuentacon20/5=4msec
antesdecederelpasoalsiguientepulso.
Esosehaceincrementandolavariableservo_active,salvoenelltimocaso(case4:)dondesereseteaa
0paravolveraempezarelciclo.
Siconectasemoslasalidadelas5lneasaunanalizadorlgicoveramosalgoascomolomostradoenla
figuraadjunta.

Encadasegmentode20/5=4mseclavariableservo_activetomaunvalordistintoyloscomandosde
levantar/bajarlalneaafectanadistintospines.Unavezquehaacabadoelpulsoyelpinhavueltoasu
nivelbajonohaynadamsquehacerparaeseservo(hastadentrode20msec),porloquepuedo
dedicarmealsiguiente.
Solofaltavercuantosservospodramosllegaramanejar.Larespuestaessencilla.Elproblemadetener
muchosservosesquepuedequetodavaestuviesemoshaciendolarondacuandosecumplieranlos20
milisegundos.Enesemomentotendramosquevolveraocuparnosdeprepararelpulsodel1erservo.
Sinuestrosservostienenunanchomximodeunos2msecconasignarunslotde2.5msecacadaservo
tendramossuficiente.20msecentre2.5msecdanuntotalde8slots.Inclusopodramosacomodar
algunomsusandoelhechodequelafrecuenciade50Hznoescrtica.Desernecesariopodramos
seguramenteincrementarelperiododelospulsosa25msec(40Hz),loquenosdaraespaciopara2
slotsadicionales.
Otroconsideracinesque%delPICquedalibreparaotrastareas.Ylarespuestaesqueprcticamente
todo.Simonitorizamoscuantonosdemoramosenlainterrupcinveremosqueesdelordende25usec
(justolacompensacinquetuvimosqueusarparaajustarmsexactamentelostimings).

http://picfernalia.blogspot.nl/2013/11/controldemultiplesservosconun.html

7/9

27/10/2015

TutorialesPIC:ControldemltiplesservosconunnicoTIMER.

PorcadatimerquetengamosTMR0salta2veces,unaparasubiryotraparabajarlalnea.Enelcaso
mximodetener8timerstendramos8x2=16interrupcionesduranteelperiodode20msec.16
interrupcionesnosocuparn
16x25=400usec=0.4msec.Eltantoporcientoquesecomelainterrupcinesporlotantode:
0.4/20=2%
LuegoelPICtienelibreun98%desusciclosparadedicarlosasusotrastareas.

PublicadoporAntonio

Recomendar esto en Google

6comentarios:
RodrigoLpez 9dediciembrede2013,8:42
Me ha sido de gran ayuda, ahora intentar aplicarlo. Aprend micros con una STM32F3 y es una bestia,
tiene varios Timers con hasta 4 canales con PWM, es una maravilla, sin embargo ahora que ando
aprendiendo PIC veo que es dificil contar con tantos recursos en hardware, as que veo muy til utilizar
soft,claro,habraplicacionesquerequieranaltaprecicinyporlotantorequieranpuroPWDporhard,sin
embargosiasloameritalaimplementacinpuesmejorinvertirenunmicromasgrande,elpwmporsoft
nospermitellevaracabolagranmayoradelosproyectos"denivelmedio"
Responder

Annimo 18demayode2014,2:37
hola.muybuenotodoelproyecto,seagradece.estoyaprendiendoaprogpicsymehasidodegranayuda.
lonicoquenotengoclaroeslaultimapartereferentea"%quesecomelainterrupcin=2%".quiere
decirestoquesiyoquieroocuparelpicconotrasfunciones(porej:leerunpin,leeruncanalanalgico,
manejar un lcd, etc) tengo un 98% disponible?....de ser asi, el programa se interrumpe
incondicionalmenteconelvalorcargadoeneltimer?.ylaultimapreguntaylamasimportanteparamies
sepuedeutilizarparalelamentelostimersdelpic?saludosygracias.
Responder

Annimo 20demayode2014,21:22
Graciasportodoslosaportes,meheledolamayoradetusarchivostratandodeaprenderaprogramarmi
pic32.
YheaprendidomuchocontuInformacin,GRACIAS!!
Responder

Annimo 1dejuniode2014,18:16
hola , una pregunta , la alimentacin del pic y de los servos son independientes, pero cuando dices que
tenganlasmismasmasas,esquetodaslastierrasvayanaunsololugar,oseaquecompartanlastierras
elpicylosservos?
Responder

GabrielSotoGonzales 23deseptiembrede2014,7:13
Brotusenlacesdedescargaestnmal..lospodrasarreglarlosporfa..!!
Responder

MiGuElAnGeL 24demarzode2015,17:18
Hice un codigo en ccs pero controlar la direccin de los motores pero solo funciona con uno ya que al
conectarotroyoprimircualquierpushbutton(derechaoizquieda)siempresedirigehaciaunmismolado
alguienpuededecirmeporquesucedeesto?
Responder

http://picfernalia.blogspot.nl/2013/11/controldemultiplesservosconun.html

8/9

27/10/2015

TutorialesPIC:ControldemltiplesservosconunnicoTIMER.

Introducetucomentario...

Comentarcomo:

Publicar

Unknown(Google)

Salir

Vistaprevia

Avisarme

Pginaprincipal

Entradaantigua

Suscribirsea:Enviarcomentarios(Atom)

PlantillaPictureWindow.ConlatecnologadeBlogger.

http://picfernalia.blogspot.nl/2013/11/controldemultiplesservosconun.html

9/9