历史上的今天
返回首页

历史上的今天

今天是:2025年01月11日(星期六)

2020年01月11日 | PIC单片机对步进电机的控制设计

2020-01-11 来源:elecfans

pIC16f874步进电机程序

listp=16f874

include

;--==*[CONSTANTS]*==--

#defineCOMMAND_2’B’

#defineCOMMAND_3’C’

#defineCOMMAND_4’D’

;--==*[VARIABLES]*==--

PIC单片机对步进电机的控制设计

cmdNumequ0x20;commandnumber.0xFFforinvalidcommand

recByteequ0x21;receivedbyte

motorLequ0x22;motordata-lowbyte

motorHequ0x23;motordata-highbyte

byteCntequ0x24;internalcounterforbytecountingduringrecepTIon

TIckLequ0x25;TIcks:lowbyte

TIckHequ0x26;ticks:highbyte

result1Lequ0x27;result:thisoneisneededforstorageofticks

result1Hequ0x28

winkelLequ0x29;winkel:tickcounterwithoutoverflowchecketc.

winkelHequ0x30

quadequ0x31;quadraturesignal,fordirectionstorage

oldbequ0x32;oldvalueofPORTB

newbequ0x33;newvalueofPORTB

tmr0o0equ0x34;tmr0overflowcounter0

tmr0o1equ0x35;tmr0overflowcounter1

wtemp1equ0x60;storagefortheWregister(rbif)

wtemp2equ0x61;storagefortheWregister(CCp2if)

wteMP3equ0x62;storagefortheWregister(rcif)

wtemp4equ0x63;storagefortheWregister(usarterrorroutines)

org0x00;--==*[RESETVECTOR]*==--

bmain

org0x04;--==*[INTVECTOR]*==--

bint_handler

org0x05;--==*[MAINPROGRAM]*==--

main:

;--==*[VARIABLES-initialize]*==--

MOVlw0xFF

MOVwfcmdNum

clrfmotorL

clrfmotorH

clrftickL

clrftickH

clrfresult1L

clrfresult1H

clrfwinkelL

clrfwinkelH

clrfquad

clrfoldb

clrfnewb

clrftmr0o0

clrftmr0o1

;--==*[PORTS-setupportB]*==--

clrfPORTB

bsfSTATUS,RP0;PIN4and5asinput(photo-interruptersignals)

MOVlwb’00110000’;pin1hastobeanoutput(directionsignal)

MOVwfTRISB;allotherpinsareoutputs,too(default)

bcfSTATUS,RP0

;--==*[PORTS-setupportC]*==--

clrfPORTC

bsfSTATUS,RP0

MOVlwb’11111011’;pin2asoutput(PWMsignal)

MOVwfTRISC;pins6and7havetobeinputs(default)

bcfSTATUS,RP0;allotherpinsareinputs,too(default)

;--==*[CCP1-setupPWMModule]*==--

bsfSTATUS,RP0

MOVlwd’249’;pwmperiod(calculatedwithformula)

MOVwfPR2

bcfSTATUS,RP0;dutycycle=0

clrfCCPR1L;CCPR1Lisupper8(bit:9.。.2)bitsofdutycycle

MOVlwb’00000101’;enabletimer2(bit:2)andsetprescaleof1:4(bit:0-1)

MOVwfT2CON;timer2isimportantforpwmoperation!

MOVlwb’00001111’;selectpwmmodeforccp1module(bit:0-3)

MOVwfCCP1CON;andresetlowertwobitsofdutycycle(bit:4-5)

;--==*[USART-setup]*==--

bsfSTATUS,RP0

MOVlw0x40;configurebaudgeneratorregister(calculatedwithformula)

MOVwfSPBRG;with:9600baud,noparity,8databits,nohandshake

MOVlwb’00100100’;enabletrasmit(bit:5)andhighspeedbaudrate(bit:2)

MOVwfTXSTA

bcfSTATUS,RP0

MOVlwb’10010000’;enableserialport(bit:7)andcontinuousreception(bit:4)

MOVwfRCSTA

clrw;w=0

MOVwfRCREG;resetUARTreceiverandfifo

MOVwfRCREG;soweCANavoidreceive/framing/overrunerrorsatthebeginning

MOVwfRCREG

MOVwfTXREG;justincase:thetxifflagisnowvalid(=1;avoidsinfiniteloopsinsendByte)

;--==*[TIMER0-setup]*==--

bsfSTATUS,RP0;thisistricky;prescalerhastobeassignedtotheWDT,

;incaseyouwanttoachieve1:1prescale

bcfOPTION_REG,PS0;first,setprescalerto1:2

bcfOPTION_REG,PS1

bcfOPTION_REG,PS2

bsfOPTION_REG,PSA;then,assignprescalertowdt;nowwehavea1:1prescalefortimer0:-)

bcfOPTION_REG,T0SE

bcfOPTION_REG,T0CS

bcfSTATUS,RP0

;--==*[INTERRUPTS-setup]*==--

bsfSTATUS,RP0

clrfPIE1

bsfPIE1,RCIE;enable“receivebyte”interrupt

bcfSTATUS,RP0

clrfINTCON;resetallinterruptflags

bsfINTCON,RBIE;enable“interruptonchange”interrupt

bsfINTCON,T0IE;enable“timer0overflow”interrupt

bsfINTCON,PEIE;enableperipheralinterrupts

bsfINTCON,GIE;enableglobalinterrupts

;--==*[MAINLOOP]*==--

loop:

bloop

;--==*[sendByte-ROUTINE]*==--

sendByte:;sendbyte(whichisstoredinW)

sendByte_l0:;waituntilnewdataarrivedintxreg

btfssPIR1,TXIF;(inDICatedviatransmitinterruptflagbit:txif)

bsendByte_l0

sendByte_l1:

MOVwfTXREG;sendnewdata

return

;--==*[INTERRUPTHANDLINGROUTINE]*==--

int_handler:

btfscRCSTA,OERR;overflowerroroccured,handleit

berr_Overflow

btfscRCSTA,FERR;framingerroroccured,handleit

berr_Frame

btfscPIR1,RCIF;receiveinterrupt:rcif

bint_USART_receive

btfscINTCON,RBIF;pininterrupt:rbif

bint_RB_change

btfscINTCON,T0IF;tmr0interrupt:t0if

bint_timer0_reset

retfie

int_RB_change:

incftickL,1;incrementticks(lowbyte)

btfscSTATUS,Z

incftickH,1;incrementticksonoverflow(highbyte)

incfwinkelL,1;sameastick,butwillnotbereset(eichungswert)

btfscSTATUS,Z

incfwinkelH,1

MOVwfwtemp1;saveW

MOVfwPORTB

MOVwfnewb;newb=PORTB

MOVlwb’00110000’;andmask

andwfoldb,1;resetallbitsexcept4and5

andwfnewb,1;resetallbitsexcept4and5

clrfquad;resetquadvalue

clrw;oldb==00?

subwfoldb,W

bzo00

MOVlwb’00010000’;oldb==01?

subwfoldb,W

bzo01

MOVlwb’00100000’;oldb==10?

subwfoldb,W

bzo10

bo11;else,oldb==11

o00:

MOVlwb’00010000’;newb==01?

subwfnewb,W

bnzquit

bsfquad,7;left

bquit

o01:

MOVlwb’00110000’;newb==11?

subwfnewb,W

bnzquit

bsfquad,7;left

bquit

o10:

clrw;newb==00?

subwfnewb,W

bnzquit

bsfquad,7;left

bquit

o11:

MOVlwb’00100000’;newb==10?

subwfnewb,W

bnzquit

bsfquad,7;left

quit:

MOVfwPORTB

MOVwfoldb;oldb=PORTB

MOVfwwtemp1;restoreW

bcfINTCON,RBIF;resetinterrupt(important)

retfie

int_timer0_reset:

btfsctmr0o0,7;wait128overflows

gotoa1

incftmr0o0,1

gotoa0

a1:

btfsctmr0o1,6;wait64overflows

gotoa4

incftmr0o1,1

gotoa0

a4:

btfscPORTB,7;ashorthack,sowecanmeasuretheimpulses

gotonext1;oftimer0withanoscillograph

bsfPORTB,7;signalisonbit7ofportb

gotomainl

next1:

bcfPORTB,7

mainl:

MOVwfwtemp2;saveW

MOVfwtickL;storeticksinresult1

MOVwfresult1L

MOVfwtickH

MOVwfresult1H

MOVfwquad;andblendthedirectionbitonMSBofresult1

iorwfresult1H,1

clrftickH;cleartickcounter

clrftickL

clrftmr0o0;cleartimer0overflowcounters

clrftmr0o1

MOVfwwtemp2;restoreW

a0:

bcfINTCON,T0IF;resetinterrupt(important)

retfie

int_USART_receive:

MOVwfwtemp3;saveW

MOVlwCOMMAND_3;command3active?

subwfcmdNum,W

bzgetData_command3;yes,handleit

MOVfwRCREG;storereceivedbyte

clrfRCREG;it’sagoodideatoflushthebuffer

clrfRCREG;afterreceivingabyte,soit’s

clrfRCREG;forcedthatwehaveanewbyteinthebufferinthenextstep

MOVwfrecByte

MOVlwCOMMAND_2;-executecommand2?

subwfrecByte,W

bzcommand2;yes,doit

MOVlwCOMMAND_3;-executecommand3?

subwfrecByte,W

bzcommand3;yes,doit

MOVlwCOMMAND_4;-executecommand4?

subwfrecByte,W

bzcommand4;yes,doit

commandUnknown:;else,receivedbyteisunknown

bsfPORTB,0;showerroronLEDs

MOVfwwtemp3;restoreW

retfie

;--==*[COMMANDEXEC-transmitmotordataindebugmode]*==--

command2:

MOVfwresult1H

callsendByte

MOVfwresult1L

callsendByte

MOVfwwinkelH

callsendByte

MOVfwwinkelL

callsendByte

MOVfwwtemp3;restoreW

retfie

;--==*[COMMANDINIT-setupforreceivemotordata(part1/2)]*==--

command3:;command3

MOVlwCOMMAND_3

MOVwfcmdNum;cmdNumcontainsnowthecurrentcommandvalue

MOVlw.2

MOVwfbyteCnt;wewantexactly2bytesfromthepc

MOVfwwtemp3;restoreW

retfie

;--==*[COMMANDEXEC-receivemotordata(part2/2)]*==--

getData_command3:

decfbyteCnt,1;handlebytecounter

bzc3_b2;ifbytecounteris0thenitisthe2ndbyte

MOVfwRCREG;else,1stbytereceive

MOVwfmotorL;storeinmotorL

bouthere;andexit

c3_b2:

MOVfwRCREG;2ndbytereceive

MOVwfmotorH;storeinmotorH

MOVlw0xFF;resetcmdNumtoundefinedvalue(0xFF)

MOVwfcmdNum

;reconfigurePWM

MOVfwmotorH

MOVwfCCPR1L;storehighbyte(8;bits9-2)

bcfCCP1CON,CCP1Y

btfscmotorL,0;storelowbyte(2;bits0)

bsfCCP1CON,CCP1Y

bcfCCP1CON,CCP1X

btfscmotorL,1;storelowbyte(2;bits1)

bsfCCP1CON,CCP1X

btfssmotorL,2;motorL《2》bitissignificantformotordirection

bturn_left

bsfPORTB,1;turnmotorright

bouthere

turn_left:

bcfPORTB,1;turnmotorleft

outhere:

MOVfwwtemp3;restoreW

retfie

;--==*[COMMANDEXEC-transmitmotordata]*==--

command4:

MOVfwresult1H;transmithighbyte

callsendByte

MOVfwresult1L;transmitlowbyte

callsendByte

MOVfwwtemp3;restoreW

retfie

;--==*[ERRORHANDLING-fortheserialcommunication]*==--

err_Overflow:;handleoverflowerror

MOVwfwtemp4;saveW

bsfPORTB,7;showerroronleds(10)

bcfPORTB,6

bcfRCSTA,CREN;dISAblecontinuousreception

MOVfRCREG,W;flushreceivefifobuffer(3bytesdeep)

MOVfRCREG,W

MOVfRCREG,W

bsfRCSTA,CREN;reenablecontinuousreception

MOVfwwtemp4;restoreW

retfie

err_Frame:;handleframeerror

MOVwfwtemp4;saveW

bcfPORTB,7;showerroronleds(01)

bsfPORTB,6

MOVfRCREG,W;flushreceivefifobuffer(3bytesdeep)

MOVfRCREG,W

MOVfRCREG,W

MOVfwwtemp4;restoreW

retfie

end

推荐阅读

史海拾趣

DIPTRONICS MANUFACTURING INC公司的发展小趣事

在稳定国内市场的基础上,圜达实业积极拓展海外市场。凭借优良的品质和快速的交期,公司的产品逐渐打入国际市场,并赢得了众多客户的信赖。如今,圜达实业的产品已营销至全球100余个国家,遍及五大洲。

DRS Technologies公司的发展小趣事

近年来,DRS在红外探测器技术领域取得了重要进展。公司在12μm像元尺寸非制冷红外探测器技术的基础上,成功研制出10μm像元尺寸的产品。这一技术的突破不仅展示了DRS在红外探测领域的实力,也为其在未来的市场竞争中提供了有力的技术支撑。

Adam Tech公司的发展小趣事

为了进一步拓展市场,Adam Tech开始实施全球化战略。公司在北美、欧洲和亚洲等地设立了多个代表处,以便更好地服务全球客户。这些代表处不仅为公司带来了更多的业务机会,也提升了公司在国际市场上的知名度。同时,公司还积极与各地合作伙伴建立紧密的合作关系,共同推动电子连接器行业的发展。

Anachip公司的发展小趣事

Anachip公司自成立以来,一直致力于半导体技术的研发。在某个关键时期,公司研发团队成功开发出一种新型的芯片技术,这项技术在性能上远超当时的行业标准。凭借这一技术突破,Anachip迅速在市场上推出了一系列高性能的芯片产品,赢得了客户的广泛认可。随着产品销量的增长,公司的知名度和市场份额也逐步提升。

德丰(DEFOND)公司的发展小趣事

德丰金属材料有限公司(简称“德丰金属”)是一家专业从事铝合金建筑型材加工的企业。随着市场竞争的加剧和环保要求的提高,公司意识到必须加快转型升级的步伐。为此,德丰金属加大了研发投入和技术改造力度,成功开发出了一系列符合绿色环保标准的新型铝合金型材产品。同时,公司还积极拓展国际市场,与多家国外知名企业建立了长期稳定的合作关系。通过不断的努力和创新,德丰金属成功实现了从传统制造业向绿色环保型制造业的转型升级。

Bellnix Co Ltd公司的发展小趣事

随着产品线的不断丰富,Bellnix开始积极拓展市场。公司通过与各大电子厂商建立合作关系,将产品应用于手机、电脑、家电等多个领域。同时,Bellnix还加强品牌建设,通过参加国际电子展会、举办技术研讨会等方式,提升品牌知名度和影响力。这些举措有效地推动了公司的市场拓展,为公司的持续发展奠定了坚实基础。

问答坊 | AI 解惑

车载/基地发射机 C331

车载/基地发射机 C331 可将突发现场的多个便携式数字图像发射机或直接接驳的摄像机的图像、声音信号接收复用后,利用一个频点进行实时远距传输,并可在有效信号覆盖范围内实现动中通,抗多径干扰能力强,传输质量稳定。该产品可广泛用于军队 ...…

查看全部问答>

眼镜屏_一个人的世界

人们喜欢听歌,但为了不打扰他人或想自己静静的欣赏,由此耳塞诞生了。如今有人喜欢看书,特别是睡觉前,开着灯,不但照亮了自己也照亮了别人,这经常会影响他人睡眠。为此我想到发明一种眼镜,只要带上这种眼镜就可以在黑夜看书而不会影响他人。当 ...…

查看全部问答>

请教一个CF问题,c#开发的,Shared Memory问题

各位,最近在6410的开发板上测试下shared memory,语言是c#,wince6.0,.net compact framework3.5, 测试下来发现内存在不停的变小,大概从36M下降到20多M【比较有规律的,每次少64k】,测试了几次,一次时间大概1个晚上,第二天发现wince的界面冻 ...…

查看全部问答>

Keil51仿真时为什么一开始就会自动出现Disassembly 窗口?

Keil51仿真时为什么一开始就会自动出现Disassembly 窗口?谢谢…

查看全部问答>

交流采样与谐波计算

我通过AD芯片采集到电流电压的瞬时值,再利用离散算法计算出电流、电压、有功、无功和多次谐波,单精度不高。想与同行交流一下计算细节。qq:345885430…

查看全部问答>

wince 编译问题

大伙或许对编译比较模糊 这是我对explorer编译时的观察记录 Build for Windows CE (Release) (Built on Apr 14 2005 13:54:39) File names: Build.log Build.wrn Build.err Build.dat BUILD: [Thrd:Sequence:Type  ] Message B ...…

查看全部问答>

做一个计数器、不会!提问

    受朋友所托帮他做个计数器,但是之前硬件方面的都没接触过,所以到这里来请教各位大侠,望不吝赐教,谢谢。 功能是这样的:有十条生产线,要统计每一条生产线上生产的产品个数(0-99),输入的方法就是按一下按钮,每按一次计数器值 ...…

查看全部问答>

关于 wince设备调用web services(高手请进)

各位大侠:     小弟最近做了一个wince上的程序,要求与数据库实时传输数据,于是小弟就采用了部署web service中间层的做法。现在在模拟器上程序运行良好,但是当部署到真机上的时候问题就出现了。当web service返回一个DataSet的时候出 ...…

查看全部问答>

TI于2007年8月2日厦门举办MSP430DAY,免费报名中

TI于2007年8月2日厦门举办MSP430DAY,免费报名中。 欢迎广大单片机爱好者及技术爱好者参加,免费报名中。 请参考网站http://www.morrihan.com.cn/msp430.htm 欢迎大家参加,也可发送邮件到dennyzheng@morrihan.com.cn报名。或致电021-58369345 ...…

查看全部问答>