查看: 1435|回复: 17
|
PWM OF DC MOTOR
[复制链接]
|
|
请问哪位有PWM CONTROL DC MOTOR SPEED 的 SIMPLE
SOURCE CODE吗?
小弟是用PIC16F877A, 和 PICBASIC PRO 的.......
希望大家能帮忙...多谢.... |
|
|
|
|
|
|
|
发表于 15-8-2006 02:30 PM
|
显示全部楼层
- Device 16F877
- Declare XTAL 4
-
- Dim Duty as byte ' Duty cycle value
-
- TRISC.2 = 0 ' Set PORTC.2 / Pin17 (CCP1) to output
- CCP1CON = %00001100 ' Set CCP1 to PWM
- T2CON = %00000101 ' Turn on Timer2, Prescale=4
- PR2 = 249 ' Set PR2 to get 1KHz out
-
- ' Duty=0= off,
- ' Duty= 128 = 50% speed,
- ' Duty 255= 100% Speed
- Duty = 128 ' Change this value for speed control
- CCPR1L = Duty
- Loop:
-
- Goto Loop ' Do it forever
复制代码
这是基本的Hardware PWM , 输出是16F877A 的pin 17, PortC.2, Xtal 是4Mhz。 改变Duty的值 (0-255), 就可以改变motor speed。
其他的你要自己做了。 |
|
|
|
|
|
|
|
楼主 |
发表于 19-8-2006 02:38 AM
|
显示全部楼层
其实我是用一个suis控制两个SPEED
以下是我的source codes(PICBASIC PRO),但是它没办法跳去
SWEEP 2 的 COMMAND.
想请教大家小弟的source code有错吗?如果有,请大家指点指点...
TRISB = 0
PortB = %00000000
start:
if Porta.0 = 0 then sweep1
if Porta.1 = 0 then sweep2
sweep1:
clear
HIGH Portb.0
LOW Portb.1
Portb.7 = 0
PWM Portb.7,125,155
goto start
sweep2:
clear
HIGH Portb.0
LOW Portb.1
Portb.7 = 0
PWM Portb.7,255,155
goto start
end |
|
|
|
|
|
|
|
发表于 19-8-2006 11:10 AM
|
显示全部楼层
其实我是用一个suis控制两个SPEED
以下是我的source codes(PICBASIC PRO),但是它没办法跳去
SWEEP 2 的 COMMAND.
你发贴时, 就应该说清楚这个,而不是问“哪位有PWM CONTROL DC MOTOR SPEED 的 SIMPLE SOURCE CODE”, 那就不会浪费时间了, 对吗?
如你要用PortA,你要把它set去Digital mode,不然它是Analog mode (ADC), 所以之前PortA 根本没操作。
加以下的code
ADCON1 = 7
ALL_DIGITAL = TRUE
- ADCON1 = 7
- ALL_DIGITAL = TRUE
- TRISB = 0
- PortB = %00000000
- start:
- if Porta.0 = 0 then sweep1
- if Porta.1 = 0 then sweep2
- sweep1:
- clear
- HIGH Portb.0
- LOW Portb.1
- Portb.7 = 0
- PWM Portb.7,125,155
- goto start
- sweep2:
- clear
- HIGH Portb.0
- LOW Portb.1
- Portb.7 = 0
- PWM Portb.7,255,155
- goto start
- end
复制代码
但是,
clear (为什么?)
HIGH Portb.0(为什么?)
LOW Portb.1(为什么?)
Portb.7 = 0(为什么?) |
|
|
|
|
|
|
|
楼主 |
发表于 19-8-2006 07:51 PM
|
显示全部楼层
不好意思, 因为过后我才懂可以不用用INTERNAL PWM的.
clear and portb.7 = 0 我已删掉,因为没有FUNCTION.
if porta.0 = 0 then sweep1
if porta.1 = 0 then sweep2
是要做INTERRUPT的.我在PIC SET porta.0 = 1 AND porta.1 = 1
在portb.0 和 GROUND 之间接SUIS.这就可以用来跳去sweep1或
sweep2.
我这样做行的通吗? |
|
|
|
|
|
|
|
发表于 20-8-2006 02:32 PM
|
显示全部楼层
原帖由 AirWalker 于 19-8-2006 07:51 PM 发表
if porta.0 = 0 then sweep1
if porta.1 = 0 then sweep2
是要做INTERRUPT的.我在PIC SET porta.0 = 1 AND porta.1 = 1
在portb.0 和 GROUND 之间接SUIS.这就可以用来跳去sweep1或
sweep2.
我这样做行的通吗?
也可以啊,方法有很多种,重要的是你明白就可以了。
你加了以下的code,可以吗?
ADCON1 = 7
ALL_DIGITAL = TRUE |
|
|
|
|
|
|
|
楼主 |
发表于 23-8-2006 10:46 PM
|
显示全部楼层
ALL_DIGITAL = TRUE
在MPLAB IDE EXECUTE 时出现以下问题:
"Syntax error.Halting build on first failure as requested
那里出问题呢?
它的是什么FUNCTION呢? |
|
|
|
|
|
|
|
发表于 24-8-2006 08:40 AM
|
显示全部楼层
原帖由 AirWalker 于 23-8-2006 10:46 PM 发表
ALL_DIGITAL = TRUE
在MPLAB IDE EXECUTE 时出现以下问题:
"Syntax error.Halting build on first failure as requested
那里出问题呢?
它的是什么FUNCTION呢?
首先,你用什么version的picbasic?compile 成功吗?
ALL_DIGITAL = TRUE, 是把PortA 设定成Digital mode, 不使用ADC。 |
|
|
|
|
|
|
|
楼主 |
发表于 24-8-2006 08:46 PM
|
显示全部楼层
原帖由 pic 于 24-8-2006 08:40 AM 发表
首先,你用什么version的picbasic?compile 成功吗?
ALL_DIGITAL = TRUE, 是把PortA 设定成Digital mode, 不使用ADC。
我用的时PICBASIC PRO 2.45
COMPILE 时不成功.
问题出现在 "ALL_DIGITAL = TRUE" 的COMMAND......
我该怎么办? |
|
|
|
|
|
|
|
发表于 25-8-2006 10:23 AM
|
显示全部楼层
原帖由 AirWalker 于 24-8-2006 08:46 PM 发表
我用的时PICBASIC PRO 2.45
COMPILE 时不成功.
问题出现在 "ALL_DIGITAL = TRUE" 的COMMAND......
我该怎么办?
我compile没问题啊。。。
你是什么 error message?
ALL_DIGITAL = TRUE 是PICbasic 的internal command。
|
|
|
|
|
|
|
|
楼主 |
发表于 25-8-2006 10:56 AM
|
显示全部楼层
你用身么PROGRAMME?
我用的是MPLAB IDE V 7.31 LINK WITH PICBASICPRO 2.45
一样吗?
以下是出现的error
|
|
|
|
|
|
|
|
发表于 25-8-2006 04:59 PM
|
显示全部楼层
原帖由 AirWalker 于 25-8-2006 10:56 AM 发表
你用身么PROGRAMME?
我用的是MPLAB IDE V 7.31 LINK WITH PICBASICPRO 2.45
一样吗?
我用的是PICBasic 2.1.
再放你的源码(完整的),我试compile你的code看看。 |
|
|
|
|
|
|
|
楼主 |
发表于 25-8-2006 11:24 PM
|
显示全部楼层
原帖由 pic 于 25-8-2006 04:59 PM 发表
我用的是PICBasic 2.1.
再放你的源码(完整的),我试compile你的code看看。
ADCON1 = 7
ALL_DIGITAL = TRUE
TRISB = 0
PortB = %00000000
start:
if Porta.0 = 0 then sweep1
if Porta.1 = 0 then sweep2
sweep1:
HIGH Portb.0
LOW Portb.1
PWM Portb.7,125,155
goto start
sweep2:
HIGH Portb.0
LOW Portb.1
PWM Portb.7,255,155
goto start
end
Z这是我的SOURCE CODE.那麻烦你咯,多谢. |
|
|
|
|
|
|
|
发表于 26-8-2006 08:46 AM
|
显示全部楼层
你的code并不完整啊,你没告诉compiler你是用什么MCU。
加入:
Device 16F877
Declare XTAL 4
- Device 16F877 ' Tell compiler you are using 16F877
- Declare XTAL 4 ' if you are using 4Mhz crystal
-
- ADCON1 = 7
- ALL_DIGITAL = TRUE
- TRISB = 0
- PortB = %00000000
- start:
- if Porta.0 = 0 then sweep1
- if Porta.1 = 0 then sweep2
- sweep1:
- HIGH Portb.0
- LOW Portb.1
- PWM Portb.7,125,155
- goto start
- sweep2:
- HIGH Portb.0
- LOW Portb.1
- PWM Portb.7,255,155
- goto start
- end
复制代码 |
|
|
|
|
|
|
|
楼主 |
发表于 27-8-2006 01:01 AM
|
显示全部楼层
原帖由 pic 于 26-8-2006 08:46 AM 发表
你的code并不完整啊,你没告诉compiler你是用什么MCU。
加入:
Device 16F877
Declare XTAL 4
Device 16F877 ' Tell compiler you are using 16F877
Declare XTAL 4 ' if you are using 4Mhz crystal ...
我用的MPLAB IDE LINK WITH PICBASICPRO 2.45,在CREATE
PROJECT时已经选了PIC16F877A.
CRYSTAL 我之前做别的SOURCE CODE 时, 没DECLARE 也可以
COMPILE.
我已经想了很久但还做不出来.
那里出错了??????? |
|
|
|
|
|
|
|
发表于 27-8-2006 10:58 AM
|
显示全部楼层
也是说,你并没有加入
Device 16F877
因为你认为不需要? |
|
|
|
|
|
|
|
楼主 |
发表于 27-8-2006 11:12 AM
|
显示全部楼层
原帖由 pic 于 27-8-2006 10:58 AM 发表
也是说,你并没有加入
Device 16F877
因为你认为不需要?
我加了
Device 16F877
Declare XTAL 4
不过我COMPLIE 时还是出现问题
问题出现在
Device 16F877
Declare XTAL 4
ALL_DIGITAL = TRUE
这三个COMMAND.
请问还有别的方法吗?
不好意思,麻烦你了. |
|
|
|
|
|
|
|
发表于 28-8-2006 09:05 AM
|
显示全部楼层
原帖由 AirWalker 于 27-8-2006 11:12 AM 发表
请问还有别的方法吗?
不好意思,麻烦你了.
别的方法是吗?简单的是不要用PortA, 你可以改用PortB,PortC, PortD 或 PortE 。但你并没解决本来的问题。 |
|
|
|
|
|
|
| |
本周最热论坛帖子
|