Académique Documents
Professionnel Documents
Culture Documents
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
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