|
要如何同时控制5个servo motor?? (全部解决了,谢谢大家的帮忙)
[复制链接]
|
|
发表于 5-3-2009 09:02 AM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 5-3-2009 03:37 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 9-3-2009 09:57 PM
|
显示全部楼层
原帖由 电动舞ver1 于 5-3-2009 03:37 PM 发表
各位大大,
请问下。
还有什么wedsite有得买servo controller和servo motor 吗???
除了以下(这是小弟知道的):
1)www.pololu.com
2)www.hobbycity.com
想要买来做control robot arm的。。。
希望有更 ...
http://www.cytron.com.my/
这里有可能有你要的东西。 |
|
|
|
|
|
|
|
发表于 9-3-2009 10:03 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 9-3-2009 10:27 PM
|
显示全部楼层
这个方法,resolution 可以很高,但是最多只有10个 channel,对吗?而且当你换其中一个 channel 的 pulse width 时,后面的 channel 会有一个 cycle 的 period 跑掉。 |
|
|
|
|
|
|
|
发表于 9-3-2009 10:34 PM
|
显示全部楼层
原帖由 waiweng83 于 9-3-2009 10:27 PM 发表
这个方法,resolution 可以很高,但是最多只有10个 channel,对吗?而且当你换其中一个 channel 的 pulse width 时,后面的 channel 会有一个 cycle 的 period 跑掉。
没错这个是他的缺点。 当改变period的时候, 后面的一个cycle会跑掉。
这个方法我用18f2550可以到16 channel.还可以。 |
|
|
|
|
|
|
|
发表于 9-3-2009 10:58 PM
|
显示全部楼层
16 channel??? 那当每一个 channel 的 pulse width 都是 2mS 时,那 period 不是变成 32mS 了?? |
|
|
|
|
|
|
|
发表于 9-3-2009 10:59 PM
|
显示全部楼层
原帖由 waiweng83 于 9-3-2009 10:58 PM 发表
16 channel??? 那当每一个 channel 的 pulse width 都是 2mS 时,那 period 不是变成 32mS 了??
用timer interrupt就可以了。 |
|
|
|
|
|
|
|
发表于 9-3-2009 11:03 PM
|
显示全部楼层
那你是不是同一时间会有两个或以上的 channel 是同时 on 的? |
|
|
|
|
|
|
|
发表于 9-3-2009 11:11 PM
|
显示全部楼层
原帖由 waiweng83 于 9-3-2009 11:03 PM 发表
那你是不是同一时间会有两个或以上的 channel 是同时 on 的?
对。 呵呵。 高手就是高手。 一讲就猜到。 |
|
|
|
|
|
|
|
发表于 9-3-2009 11:25 PM
|
显示全部楼层
之前我有想过这样子作,但是有一个问题想不到解决方法
比如说你的 channel 1 和 9 是一起 on,然后是 2 和 10, 3 和 11。。。Resolution 是 0.5uS。
但是当你的 Channel 1 pulse width = 1mS, Channel 9 pulse width = 1.0005mS 时,你怎样作?一开始,会先把 Channel 1 和 9 set high,然后 1mS 后把 channel 1 clear 掉。问题来了。要怎样在 0.5uS 内,跳出 interrupt,然后再进回 interrupt 里把 channel 9 clear 掉呢? |
|
|
|
|
|
|
|
发表于 11-3-2009 09:57 AM
|
显示全部楼层
不好意识。。
请问大大们,
那里有的买32-pin的servo controller..
如以下的:
找到了。对不起。。
[ 本帖最后由 电动舞ver1 于 11-3-2009 10:05 AM 编辑 ] |
|
|
|
|
|
|
|
发表于 17-3-2009 08:35 AM
|
显示全部楼层
原帖由 waiweng83 于 9-3-2009 11:25 PM 发表
之前我有想过这样子作,但是有一个问题想不到解决方法
比如说你的 channel 1 和 9 是一起 on,然后是 2 和 10, 3 和 11。。。Resolution 是 0.5uS。
但是当你的 Channel 1 pulse width = 1mS, Channel ...
用多过一个timer就会有这种问题。 哈。我暂时还没想到解决方法。如果遇到这种问题。 mcu 够快就可以了。 只怕不够快。 就要另想办法,
不过给搂主的case够用的了。
不过5个channal就不会有这个问题。
[ 本帖最后由 fritlizt 于 17-3-2009 08:37 AM 编辑 ] |
|
|
|
|
|
|
|
楼主 |
发表于 3-4-2009 10:59 AM
|
显示全部楼层
回复 33# fritlizt 的帖子
我照着你要我做的方式来做,现写1Hz的blinking LED。
我用DELAY就可以,但是用TIMER INTERRUPT就出现怪怪的RESULT。
我不懂问题出在哪里,我没用过TIMER INTERRUPT。
- #include <16F877A.h>
- #use delay(clock=20000000)
- #fuses HS,NOWDT,NOPROTECT,NOLVP
- int count1=0;
- void main()
- {
- setup_timer_1 (T1_INTERNAL);
- enable_interrupts(GLOBAL);
- enable_interrupts(INT_TIMER1);
- set_timer1(60536); //interrupt at 1ms
-
- while(1);
- }
- #INT_TIMER1
- void timer1_interrupt ()
- {
- count1++;
-
- if(count1==500)
- {
- output_low(PIN_A0);
- }
- if(count1==1000)
- {
- count1=0;
- output_high(PIN_A0);
- }
- }
复制代码 |
|
|
|
|
|
|
|
发表于 3-4-2009 11:28 AM
|
显示全部楼层
原帖由 crazybear 于 3-4-2009 10:59 AM 发表
我照着你要我做的方式来做,现写1Hz的blinking LED。
我用DELAY就可以,但是用TIMER INTERRUPT就出现怪怪的RESULT。
我不懂问题出在哪里,我没用过TIMER INTERRUPT。
#include
#use ...
int count1-->unsigned int16 count1.
你要算到1000,用16bit variable.
timer1 interrupt 没有reload timer1 value.
setup timer1 prescaler?用1 也好也写下去。 以后容易读。 |
|
|
|
|
|
|
|
楼主 |
发表于 3-4-2009 12:17 PM
|
显示全部楼层
原帖由 fritlizt 于 3-4-2009 11:28 AM 发表
int count1-->unsigned int16 count1.
你要算到1000,用16bit variable.
timer1 interrupt 没有reload timer1 value.
setup timer1 prescaler?用1 也好也写下去。 以后容易读。
要谢谢fritlizt兄指导,终於可以走了。
以下是修改后的CODE跟PROTEUS的RESULT。
- #include <16F877A.h>
- #use delay(clock=20000000)
- #fuses HS,NOWDT,NOPROTECT,NOLVP
- unsigned int16 count1=0;
- void main()
- {
- setup_timer_1 (T1_INTERNAL|T1_DIV_BY_1);
- enable_interrupts(GLOBAL);
- enable_interrupts(INT_TIMER1);
- set_timer1(60536); //interrupt at 1ms
- output_high(PIN_A0);
-
- while(1);
- }
- #INT_TIMER1
- void timer1_interrupt ()
- {
- set_timer1(60536);
- count1++;
-
- if(count1==500)
- {
- output_low(PIN_A0);
- }
- if(count1==1000)
- {
- count1=0;
- output_high(PIN_A0);
- }
- }
复制代码
PROTEUS的RESULT,可能是太慢的关系,所以不能拿到FULL CYCLE的WAVEFORM。
|
评分
-
查看全部评分
|
|
|
|
|
|
|
发表于 3-4-2009 07:48 PM
|
显示全部楼层
接下来你要做的就是
void main()
{
setup_timer_1 (T1_INTERNAL|T1_DIV_BY_1);
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER1);
set_timer1(60536); //interrupt at 1ms
output_high(PIN_A0);
led 闪1hz;
delay 1s;
led 闪2hz
delay 1s;
led 闪4hz;
while(1);
}
想想看要怎样做吧。 |
|
|
|
|
|
|
|
楼主 |
发表于 5-4-2009 05:47 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 5-4-2009 06:57 PM
|
显示全部楼层
原帖由 crazybear 于 5-4-2009 05:47 PM 发表
做到了!#include
#use delay(clock=20000000)
#fuses HS,NOWDT,NOPROTECT,NOLVP
unsigned int16 count1=0, value1;
void main()
{
setup_timer_1 (T1_INTERNAL|T1_D ...
嗯。。。。大概是这样。 你的simulation看不到东西。
可能是interval太长了。
接下来。 做换duty cycle.
1ms on, 3ms off.
有两种方法, 一种是counter, fix interrupt。
另一种是直接换interrupt time.1ms interrupt, 3ms interrupt. etc.
用第二种方法。 |
|
|
|
|
|
|
|
楼主 |
发表于 5-4-2009 07:56 PM
|
显示全部楼层
原帖由 fritlizt 于 5-4-2009 06:57 PM 发表
嗯。。。。大概是这样。 你的simulation看不到东西。
可能是interval太长了。
接下来。 做换duty cycle.
1ms on, 3ms off.
有两种方法, 一种是counter, fix interrupt。
另一种是直接换interrupt time.1 ...
我想应该是这样吧!
但是那input_state() function好像没有做用这样的。
那OUTPUT ALWAYS HIGH
- #include <16F877A.h>
- #use delay(clock=20000000)
- #fuses HS,NOWDT,NOPROTECT,NOLVP
- void main()
- { setup_timer_1 (T1_INTERNAL|T1_DIV_BY_1);
- enable_interrupts(GLOBAL);
- enable_interrupts(INT_TIMER1);
- set_timer1(60536); //interrupt at 1ms
- output_high(PIN_A0);
-
- while(1);
- }
- #INT_TIMER1
- void timer1_interrupt ()
- {
- if(input_state(PIN_A0))
- {
- output_low(PIN_A0);
- set_timer1(50536);
- }
- else
- {
- output_high(PIN_A0);
- set_timer1(60536);
- }
- clear_interrupt(INT_TIMER1);
- }
复制代码 |
|
|
|
|
|
|
| |
本周最热论坛帖子
|