|
本帖最后由 Shuyang 于 2019-3-1 11:59 编辑
LZ莫急~失败是成功之母:)
以下是电机调试用到的模块12的实现步骤,请麻烦再试一下,如果还有问题的话,请把程序贴上来,我们再交流,谢谢。
调试电机最直接的方法是用模块12的程序,在tirslk_maze_1_00_00程序包的Lab12_Motors中。
打开Lab12_Motorsmain.c,可以看到调试用的主函数已经写好了,预计实现的功能是让电机正转、反转、转弯等等:
- // does the robot move straight?
- int main(void){ // Program12_4
- Clock_Init48MHz();
- LaunchPad_Init(); // built-in switches and LEDs
- Bump_Init(); // bump switches
- Motor_InitSimple(); // initialization
- while(1){
- // Pause(); // start on SW1 or SW2
- LaunchPad_Output(0x02);
- Motor_ForwardSimple(5000,350); // 3.5 seconds and stop
- LaunchPad_Output(0x00);
- Motor_StopSimple(); Clock_Delay1ms(500);
- LaunchPad_Output(0x01);
- Motor_BackwardSimple(3000,200); // reverse 2 sec
- LaunchPad_Output(0x03);
- Motor_LeftSimple(3000,200); // right turn 2 sec
- if(Bump_Read()){
- LaunchPad_Output(0x01);
- Motor_BackwardSimple(3000,100);// reverse 1 sec
- LaunchPad_Output(0x03);
- Motor_LeftSimple(3000,200); // right turn 2 sec
- }
- }
- }
复制代码
用户需要做的是把此实验对应的库文件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四个引脚设为输出引脚。
- void Motor_InitSimple(void){
- // Initializes the 6 GPIO lines and puts driver to sleep
- // Returns right away
- // initialize P1.6 and P1.7 and make them outputs
- // write this as part of Lab 12
- P1->SEL0 &= ~0xC0;
- P1->SEL1 &= ~0xC0; // configure as GPIO
- P1->DIR |= 0xC0; // make pins out
- P1->OUT &= ~0xC0;
- P3->SEL0 &= ~0xC0;
- P3->SEL1 &= ~0xC0; // configure as GPIO
- P3->DIR |= 0xC0; // make pins out
- P3->OUT &= ~0xC0; // low current sleep mode
- }
复制代码
下面需要写Motor_ForwardSimple、Motor_BackwardSimple、Motor_LeftSimple、Motor_RightSimple四个函数,他们分别实现了小车前进、后退、左转、右转。
以Motor_ForwardSimple作为例子,其他三个函数类似。
Motor_ForwardSimple的实现方式是利用MSP432的定时器的比较捕获单元产生PWM来驱动电机,具体原理可以看一下模块13。具体代码如下:
- void Motor_ForwardSimple(uint16_t duty, uint32_t time){
- // Drives both motors forward at duty (100 to 9900)
- // Runs for time duration (units=10ms), and then stops
- // Stop the motors and return if any bumper switch is active
- // Returns after time*10ms or if a bumper switch is hit
- // write this as part of Lab 12
- P1->OUT &= ~0xC0; // set direction of motors
- PWM_Init34(15000, duty, duty);
- P3->OUT |= 0xC0; // activate motors
- Clock_Delay1ms(10*time);
- 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代码:
- void PWM_Init34(uint16_t period, uint16_t duty3, uint16_t duty4){
- // write this as part of Lab 13
- if(duty3 >= period) return; // bad input
- if(duty4 >= period) return; // bad input
- P2->DIR |= 0xC0; // P2.6, P2.7 output
- P2->SEL0 |= 0xC0; // P2.6, P2.7 Timer0A functions
- P2->SEL1 &= ~0xC0; // P2.6, P2.7 Timer0A functions
- TIMER_A0->CCTL[0] = 0x0080; // CCI0 toggle
- TIMER_A0->CCR[0] = period; // Period is 2*period*8*83.33ns is 1.333*period
- TIMER_A0->EX0 = 0x0000; // divide by 1
- TIMER_A0->CCTL[3] = 0x0040; // CCR3 toggle/reset
- TIMER_A0->CCR[3] = duty3; // CCR3 duty cycle is duty3/period
- TIMER_A0->CCTL[4] = 0x0040; // CCR4 toggle/reset
- TIMER_A0->CCR[4] = duty4; // CCR4 duty cycle is duty4/period
- TIMER_A0->CTL = 0x02F0; // SMCLK=12MHz, divide by 8, up-down mode
- // bit mode
- // 9-8 10 TASSEL, SMCLK=12MHz
- // 7-6 11 ID, divide by 8
- // 5-4 11 MC, up-down mode
- // 2 0 TACLR, no clear
- // 1 0 TAIE, no interrupt
- // 0 TAIFG
- }
复制代码
至此,PWM.c就可以产生PWM波了。现在只要下载运行Lab12的Lab12_Motorsmain.c,应该可以观察到小车前进一段时间又自动停止了。
之后LZ可以自行补充Motor_BackwardSimple等函数,就可以实现后退、左传和右转了。
|
|