为什么RSLK小车每次启动它都是往反方向走的?

[复制链接]

3

主题

11

帖子

28

积分

一粒轻沙

Rank: 1

积分
28
楼主
查看: 15488回复: 14 发表于 2019-2-24 23:54:03   只看该作者
为什么RSLK小车每次启动它都是往反方向走的?

17

主题

137

帖子

553

积分

单晶硅锭

Rank: 3Rank: 3

积分
553
沙发
发表于 2019-2-25 11:47:29   只看该作者
是说运动方向与预想的相反吗?

3

主题

11

帖子

28

积分

一粒轻沙

Rank: 1

积分
28
板凳
发表于 2019-2-25 19:54:32   只看该作者
Shuyang 发表于 2019-2-25 11:47
是说运动方向与预想的相反吗?

不是,就是倒车的意思

0

主题

2

帖子

95

积分

一粒轻沙

Rank: 1

积分
95
4#
发表于 2019-2-25 21:15:00   只看该作者
是不是电机接反了

17

主题

137

帖子

553

积分

单晶硅锭

Rank: 3Rank: 3

积分
553
5#
发表于 2019-2-26 15:25:10   只看该作者
seraph 发表于 2019-2-25 19:54
不是,就是倒车的意思

如果电机没有接反的话,改一下电机驱动芯片对应DIR引脚的赋值

2

主题

6

帖子

32

积分

一粒轻沙

Rank: 1

积分
32
6#
发表于 2019-2-26 23:49:12   只看该作者
你看一下驱动芯片上DIR所对应的GPIO引脚的值 0是前进 1是后退

3

主题

11

帖子

28

积分

一粒轻沙

Rank: 1

积分
28
7#
发表于 2019-2-27 18:20:56   只看该作者
Shuyang 发表于 2019-2-25 11:47
是说运动方向与预想的相反吗?

小车刚拼好的时候还要调电机吗?怎么调

3

主题

11

帖子

28

积分

一粒轻沙

Rank: 1

积分
28
8#
发表于 2019-2-27 18:30:58   只看该作者
seraph 发表于 2019-2-27 18:20
小车刚拼好的时候还要调电机吗?怎么调

而且如果把那个MSP432反接也就是本来正面变成反面,反面变成正面,这样的话,有些程序小车的两个轮子还能动起来但是是反着跑的,但是我接对了却轮子不动了。我就彻底懵了

3

主题

11

帖子

28

积分

一粒轻沙

Rank: 1

积分
28
9#
发表于 2019-2-27 18:33:09   只看该作者
seraph 发表于 2019-2-27 18:30
而且如果把那个MSP432反接也就是本来正面变成反面,反面变成正面,这样的话,有些程序小车的两个轮子还能 ...

所以我现在学习都是完全再看程序,理解程序,没有一个再小车上实现?很无奈

17

主题

137

帖子

553

积分

单晶硅锭

Rank: 3Rank: 3

积分
553
10#
发表于 2019-2-27 19:44:02   只看该作者
seraph 发表于 2019-2-27 18:30
而且如果把那个MSP432反接也就是本来正面变成反面,反面变成正面,这样的话,有些程序小车的两个轮子还能 ...

按照安装说明接线的话,应该没有问题。电机和MSP432之间的接线是固定接口,一般不会接反
LZ还需要再看下模块12 电机驱动,详细理解下电机驱动芯片的工作原理,是有引脚专门控制方向的

3

主题

11

帖子

28

积分

一粒轻沙

Rank: 1

积分
28
11#
发表于 2019-2-28 12:35:35   只看该作者
Shuyang 发表于 2019-2-27 19:44
按照安装说明接线的话,应该没有问题。电机和MSP432之间的接线是固定接口,一般不会接反
LZ还需要再看下 ...

那个排针我没有焊上去,会不会是这个原因?

0

主题

3

帖子

7

积分

一粒轻沙

Rank: 1

积分
7
12#
发表于 2019-2-28 13:21:21   只看该作者
小车怎么样才能动啊?

17

主题

137

帖子

553

积分

单晶硅锭

Rank: 3Rank: 3

积分
553
13#
发表于 2019-2-28 13:44:33   只看该作者
seraph 发表于 2019-2-28 12:35
那个排针我没有焊上去,会不会是这个原因?

是有可能的,电机驱动信号可能用到排针上的引脚

3

主题

11

帖子

28

积分

一粒轻沙

Rank: 1

积分
28
14#
发表于 2019-2-28 18:09:08   只看该作者
Shuyang 发表于 2019-2-28 13:44
是有可能的,电机驱动信号可能用到排针上的引脚

实话说我看了原理图,不需要用到排针上的引脚,而且如果需要用的,那么我把主板反接也不可能转。我放弃了,什么鬼。所有的关于电机的程序都运行不了

17

主题

137

帖子

553

积分

单晶硅锭

Rank: 3Rank: 3

积分
553
15#
发表于 2019-3-1 11:58:18   只看该作者
本帖最后由 Shuyang 于 2019-3-1 11:59 编辑
seraph 发表于 2019-2-28 18:09
实话说我看了原理图,不需要用到排针上的引脚,而且如果需要用的,那么我把主板反接也不可能转。我放弃了 ...

LZ莫急~失败是成功之母:)

以下是电机调试用到的模块12的实现步骤,请麻烦再试一下,如果还有问题的话,请把程序贴上来,我们再交流,谢谢。


调试电机最直接的方法是用模块12的程序,在tirslk_maze_1_00_00程序包的Lab12_Motors中。
打开Lab12_Motorsmain.c,可以看到调试用的主函数已经写好了,预计实现的功能是让电机正转、反转、转弯等等:
  1. // does the robot move straight?
  2. int main(void){ // Program12_4
  3.   Clock_Init48MHz();
  4.   LaunchPad_Init();   // built-in switches and LEDs
  5.   Bump_Init();        // bump switches
  6.   Motor_InitSimple(); // initialization
  7.   while(1){
  8.   //  Pause(); // start on SW1 or SW2
  9.     LaunchPad_Output(0x02);
  10.     Motor_ForwardSimple(5000,350);  // 3.5 seconds and stop
  11.     LaunchPad_Output(0x00);
  12.     Motor_StopSimple(); Clock_Delay1ms(500);
  13.     LaunchPad_Output(0x01);
  14.     Motor_BackwardSimple(3000,200); // reverse 2 sec
  15.     LaunchPad_Output(0x03);
  16.     Motor_LeftSimple(3000,200);     // right turn 2 sec
  17.     if(Bump_Read()){
  18.       LaunchPad_Output(0x01);
  19.       Motor_BackwardSimple(3000,100);// reverse 1 sec
  20.       LaunchPad_Output(0x03);
  21.       Motor_LeftSimple(3000,200);   // right turn 2 sec
  22.     }
  23.   }
  24. }
复制代码


用户需要做的是把此实验对应的库文件MotorSimple.c中的函数补充完整(不写这些函数的话电机不会转)

在程序包的inc文件夹中找到MotorSimple.c,可以看到里面有几个子函数,像Motor_InitSimple、Motor_ForwardSimple、Motor_BackwardSimple等等,其中的代码有些是空的,会有注释“// write this as part of Lab 12”,需要根据接线图把对应的引脚进行初始化。

引脚图在模块12的讲解PPT中可以找到:



每个电机分别由DIR、PWM、nSLP三个引脚来控制,其中DIR控制电机转动方向,PWM要有一个PWM波来驱动电机、nSLP控制电机休眠。

首先需要通过Motor_InitSimple函数,初始化电机对应的引脚。主要是把P1.6、P1.7、P3.6、P3.7四个引脚设为输出引脚。
  1. void Motor_InitSimple(void){
  2. // Initializes the 6 GPIO lines and puts driver to sleep
  3. // Returns right away
  4. // initialize P1.6 and P1.7 and make them outputs

  5.   // write this as part of Lab 12
  6.   P1->SEL0 &= ~0xC0;
  7.   P1->SEL1 &= ~0xC0;  // configure as GPIO
  8.   P1->DIR |= 0xC0;    // make pins out
  9.   P1->OUT &= ~0xC0;

  10.   P3->SEL0 &= ~0xC0;
  11.   P3->SEL1 &= ~0xC0;  // configure as GPIO
  12.   P3->DIR |= 0xC0;    // make pins out
  13.   P3->OUT &= ~0xC0;   // low current sleep mode
  14. }
复制代码


下面需要写Motor_ForwardSimple、Motor_BackwardSimple、Motor_LeftSimple、Motor_RightSimple四个函数,他们分别实现了小车前进、后退、左转、右转。

以Motor_ForwardSimple作为例子,其他三个函数类似。

Motor_ForwardSimple的实现方式是利用MSP432的定时器的比较捕获单元产生PWM来驱动电机,具体原理可以看一下模块13。具体代码如下:
  1. void Motor_ForwardSimple(uint16_t duty, uint32_t time){
  2. // Drives both motors forward at duty (100 to 9900)
  3. // Runs for time duration (units=10ms), and then stops
  4. // Stop the motors and return if any bumper switch is active
  5. // Returns after time*10ms or if a bumper switch is hit

  6.   // write this as part of Lab 12
  7.   P1->OUT &= ~0xC0;   // set direction of motors
  8.   PWM_Init34(15000, duty, duty);
  9.   P3->OUT |= 0xC0;    // activate motors
  10.   Clock_Delay1ms(10*time);
  11.   Motor_StopSimple();
复制代码


其中最关键的部分就是用PWM_Init34这个函数产生了一个PWM波。这个函数在inc文件夹中的PWM.c中。

PWM_Init34也是需要自己编写的,不过好在PWM.c中已经给出了一个PWM_Init12函数,它和PWM_Init34是兄弟,区别只是在于它是控制P2.4和P2.5,而PWM_Init34是控制P2.6和P2.7。因此
我们直接把PWM_Init12的代码移植到PWM_Init34,把对应的引脚改过来即可。

以下是改写完成的PWM_Init34代码:
  1. void PWM_Init34(uint16_t period, uint16_t duty3, uint16_t duty4){

  2.   // write this as part of Lab 13
  3.   if(duty3 >= period) return; // bad input
  4.   if(duty4 >= period) return; // bad input
  5.   P2->DIR |= 0xC0;          // P2.6, P2.7 output
  6.   P2->SEL0 |= 0xC0;         // P2.6, P2.7 Timer0A functions
  7.   P2->SEL1 &= ~0xC0;        // P2.6, P2.7 Timer0A functions
  8.   TIMER_A0->CCTL[0] = 0x0080;      // CCI0 toggle
  9.   TIMER_A0->CCR[0] = period;       // Period is 2*period*8*83.33ns is 1.333*period
  10.   TIMER_A0->EX0 = 0x0000;          // divide by 1
  11.   TIMER_A0->CCTL[3] = 0x0040;      // CCR3 toggle/reset
  12.   TIMER_A0->CCR[3] = duty3;        // CCR3 duty cycle is duty3/period
  13.   TIMER_A0->CCTL[4] = 0x0040;      // CCR4 toggle/reset
  14.   TIMER_A0->CCR[4] = duty4;        // CCR4 duty cycle is duty4/period
  15.   TIMER_A0->CTL = 0x02F0;        // SMCLK=12MHz, divide by 8, up-down mode
  16.   // bit  mode
  17.   // 9-8  10    TASSEL, SMCLK=12MHz
  18.   // 7-6  11    ID, divide by 8
  19.   // 5-4  11    MC, up-down mode
  20.   // 2    0     TACLR, no clear
  21.   // 1    0     TAIE, no interrupt
  22.   // 0          TAIFG
  23. }
复制代码


至此,PWM.c就可以产生PWM波了。现在只要下载运行Lab12的Lab12_Motorsmain.c,应该可以观察到小车前进一段时间又自动停止了。

之后LZ可以自行补充Motor_BackwardSimple等函数,就可以实现后退、左传和右转了。
快速回复 返回顶部 返回列表