0 卖盘信息
您现在的位置: 首页 > 商城快讯 > 行业新闻> 技术信息 > PIC单片机对步进电机的控制设计

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

来源: 电子发烧友
2018-12-06
类别:技术信息
eye 34
文章创建人 拍明芯城

原标题:PIC单片机对步进电机的控制设计

  

  pIC16f874步进电机程序

  listp=16f874

  include

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

  #defineCOMMAND_2’B’

  #defineCOMMAND_3’C’

  #defineCOMMAND_4’D’

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

  pIC16f874步进电机程序.png

  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

  【PIC单片机

  同步电动机运行稳定性和可靠性对工业生产有重要的影响。单片机用于同步电动机励磁控制,由于软件丰富,能使励磁装置结构简化、功能增多且易于实现复杂的控制规律,同时还具有参数整定灵活,使用维护方便和故障自诊断功能。目前,国内许多基于单片机的同步电动机励磁控制系统与传统的模拟励磁控制系统相比性能有很大的提高,但因为采用的单片机内部资源较少使得单片机外围电路复杂,其内部控制程序采用查表的方法,这样影响了整个励磁控制系统的精度、快速性和稳定性。PIC16F877单片机内部资源丰富,广泛应用于工业控制领域。我们研制了基于PIC16F877单片机的同步电动机新型智能励磁控制系统,控制程序可以实时计算,利用内部的捕捉单元可以很容易实现自动投励、全压投切电路。同时我们通过控制晶闸管移相整流模块的控制端电压来控制整流模块的输出,使得整个系统硬件电路简单、调试维护方便、系统性能较高。

  简介

  1.PIC单片机(Peripheral Interface Controller)是一种用来开发和控制外围设

  备的集成电路(IC)。一种具有分散作用(多任务)功能的CPU。与人类相比,大脑就是CPU,PIC 共享的部分相当于人的神经系统。

  2.PIC 单片机是一个小的计算机。

  3.PIC单片机有计算功能和记忆内存像CPU并由软件控制运行。然而,处理能力—般,存储器容量也很有限,这取决于PIC的类型。但是它们的最高操作频率大约都在20MHz左右,存储器容量用做写程序的大约1K—4K字节。

  时钟频率与扫描程序的时间和执行程序指令的时间有关系。但不能仅以时钟频率来判断程序处理能力,它还随处理装置的体系结构改变(1*)。如果是同样的体系结构,时钟频率较高的处理能力会较强。

  详细介绍

  这里用字来解释程序容量。用一个指令(2*)表示一个字。通常用字节(3*)来表示存储器(4*)容量。一个字节有8位,每位由1或0组成。PIC16F84A单片机的指令由14位构成。当把1K个指令转换成位为:1 x 1,024 x 14 = 14,336位。再转换为字节为:14,336/(8 x 1,024) = 1.75K。在计算存储器的容量时,我们规定 1G 字节 = 1,024M 字节, 1M 字节 = 1,024K 字节, 1K 字节= 1,024 位. 它们不是以1000为倍数,因为这是用二进制计算的缘故。

  1*计算机的物理结构,包括组织结构、容量、该计算机的CPU、存储器以及输入输出设备间的互连。经常特指CPU的组织结构,包括它的寄存器、标志、总线、算术逻辑部件、指令译码与执行机制以及定时和控制部件。

  2*指出某种操作并标识其操作数(如果有操作数的话)的一种语言构造

  3*作为一个单位来操作(运算)的一个二进制字符串,通常比计算机的一个字短。

  4*处理机内的所有可寻址存储空间以及用于执行指令的其它内存储器。

  在计算存储器的容量时,我们规定 1G 字节 = 1,024M 字节, 1M 字节 = 1,024K 字节, 1K 字节= 1,024 字节. 它们不是以1000为倍数,因为这是用二进制计算的缘故。

  用PIC单片机使电路做的很小巧变得可能。

  因为PIC单片机可以把计算部分、内存、输入和输出等都做在一个芯片内。所以她工作起来效率很高、功能也自由定义还可以灵活的适应不同的控制要求,而不必去更换不同的IC。这样电路才有可能做的很小巧。

  命名规则

 

PIC

XX

XXX

XXX

(X)

-XX

X

/XX

1

2

3

4

5

6

7

8


  1.前缀: PIC MICROCHIP 公司产品代号,特别地:dsPIC为集成DSP功能的新型PIC单片机

  2.系列号:10、12、16、18、24、30、33、32,其中

  PIC10、PIC12、PIC16、PIC18为8位单片机

  PIC24、dsPIC30、dsPIC33为16位单片机

  PIC32为32位单片机

  3.器件型号(类型):

  C CMOS 电路

  CR CMOS ROM

  LC 小功率CMOS 电路

  LCS 小功率保护

  AA 1.8V

  LCR 小功率CMOS ROM

  LV 低电压

  F 快闪可编程存储器

  HC 高速CMOS

  FR FLEX ROM

  4.改进类型或选择

  54A 、58A 、61 、62 、620 、621

  622 、63 、64 、65 、71 、73 、74

  42 、43 、44等

  5.晶体标示:

  LP 小功率晶体,

  RC 电阻电容,

  XT 标准晶体/振荡器

  HS 高速晶体

  6.频率标示:

  -02 2MHZ,

  -04 4MHZ,

  -10 10MHZ,

  -16 16MHZ

  -20 20MHZ,

  -25 25MHZ,

  -33 33MHZ

  7.温度范围:

  空白 0℃至70℃,

  I -45℃至85℃,

  E -40℃至125℃

  8.封装形式:

  L PLCC 封装

  JW 陶瓷熔封双列直插,有窗口

  P 塑料双列直插

  PQ 塑料四面引线扁平封装

  W 大圆片

  SL 14腿微型封装-150mil

  JN 陶瓷熔封双列直插,无窗口

  SM 8腿微型封装-207mil

  SN 8腿微型封装-150 mil

  VS 超微型封装8mm×13.4mm

  SO 微型封装-300 mil

  ST 薄型缩小的微型封装-4.4mm

  SP 横向缩小型塑料双列直插

  CL 68腿陶瓷四面引线,带窗口

  SS 缩小型微型封装

  PT 薄型四面引线扁平封装

  TS 薄型微型封装8mm×20mm

  TQ 薄型四面引线扁平封装


责任编辑:David

【免责声明】

1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing(at)iczoom.com),本方将及时处理。

2、本文的引用仅供读者交流学习使用,不涉及商业目的。

3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。

4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing(at)iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。

拍明芯城拥有对此声明的最终解释权。

相关资讯