使用msp432搭建的平衡小車(一)


1、前言

  筆者是一名大二學生曾經荒廢一年學業,現在不斷學習,所以有任何問題都希望討論提出,你們的支持就是我的動力。

關於硬件搭建的步驟,筆者就不提網上方案太多了,筆者使用編碼器電機,驅動采用tb6612,因為整體線路采用洞洞板焊接,顏值太丑就不展示實物圖了。

2、正文

  打開ccs建立DriverLib模板工程

  建立方法:1、工具欄project中找到project wizard點擊

     2、在輸入欄中輸入你的開發板型號

     3、找到driverlib_empty_project_from_source 導入工程

     第一次導入會提示安裝SDK,安裝重啟后再導入

  平衡小車第一步:驅動電機

    首先我們得知道如何使用GPIO,在DriverLib中的gpio文件指出了使用方法

    先將GPIO設置為輸出  GPIO_setAsOutputPin(port,pin) 

    設置輸出電平,高電平 GPIO_setOutputHighOnPin(port,pin) 

           低電平  GPIO_setOutputLowOnPin(port,pin) 

    使倆個電機正轉 

int main(void){
    MAP_GPIO_setAsOutputPin(
            GPIO_PORT_P6,
            GPIO_PIN0
            );
    MAP_GPIO_setAsOutputPin(
            GPIO_PORT_P5,
            GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2
            );
    MAP_GPIO_setAsOutputPin(
            GPIO_PORT_P3,
            GPIO_PIN5
            );
    MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P6, GPIO_PIN0); 
    //置高stby 使驅動工作
    MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P5, GPIO_PIN0); 
    MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P5, GPIO_PIN1); 
    MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P3, GPIO_PIN5); 
    MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P5, GPIO_PIN2);
    while(1){
  
    }
}  

    當然我們還需要控制電機速度,方法就用pwm控制吧,先學習下如何使用msp432的pwm。

    生成pwm有倆種方法:用定時器A模擬出pwm信號,另一種是定時器A生成一個pwm信號

    在timer_a文件中 void Timer_A_generatePWM 方法中聲明 Generate a PWM with timer running in up mode  所以同樣會占用一個定時器,但是定制好了模塊操作起來會很快,

    因為效率至上,我采用了這種方法

     void Timer_A_generatePWM(uint32_t timer, const Timer_A_PWMConfig *config); 方法中有倆個參數

    第一個參數是定時器,有四個定時器

TIMER_A0_BASE
TIMER_A1_BASE
TIMER_A2_BASE
TIMER_A3_BASE

    第二個參數是配置結構體

typedef struct _Timer_A_PWMConfig
{ 
    uint_fast16_t clockSource;   //時鍾源
    uint_fast16_t clockSourceDivider; //時鍾分割
    uint_fast16_t timerPeriod;     //周期
    uint_fast16_t compareRegister; // 比較寄存器
    uint_fast16_t compareOutputMode; //模式
    uint_fast16_t dutyCycle; //占空比
} Timer_A_PWMConfig;

   前三項影響pwm頻率:時鍾頻率  /  周期 , 關於比較寄存器在方法中沒有細講,告知我們查詢數據手冊,在查詢過后得知每個TimerA定時器都有5個比較寄存器

在手冊中 Input/Output Diagrams 有標注 ,但是我有一點疑惑在方法中卻注釋了7個比較器通道(0 - 6)那么剩下的倆個是什么,希望知道的可以解釋下。

   模式選擇 TIMER_A_OUTPUTMODE_RESET_SET  重新計數 。占空比為pwm中高電平數,當需要調節占空比時可以直接對結構體中dutycycle賦值,

   再使用 Timer_A_generatePWM 方法配置。

   到這里pwm使用方法就明白了

   我們建立my_pwm.c文件,文件內容

/*
 * my_PWM.C
 *
 *  Created on: 2021年7月29日
 *      Author: Administrator
 */
#include  <my_PWM.H>

Timer_A_PWMConfig pwmConfig1 =
{
        TIMER_A_CLOCKSOURCE_SMCLK,
        TIMER_A_CLOCKSOURCE_DIVIDER_4,
        3200,
        TIMER_A_CAPTURECOMPARE_REGISTER_2,
        TIMER_A_OUTPUTMODE_RESET_SET,
        0
};
Timer_A_PWMConfig pwmConfig2 =
{
        TIMER_A_CLOCKSOURCE_SMCLK,
        TIMER_A_CLOCKSOURCE_DIVIDER_4,
        3200,
        TIMER_A_CAPTURECOMPARE_REGISTER_3,
        TIMER_A_OUTPUTMODE_RESET_SET,
        0
};
void PWM_Init(void){

      MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN5,GPIO_PRIMARY_MODULE_FUNCTION);
      MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN6,GPIO_PRIMARY_MODULE_FUNCTION);

      MAP_Timer_A_generatePWM(TIMER_A0_BASE, &pwmConfig1);
      MAP_Timer_A_generatePWM(TIMER_A0_BASE, &pwmConfig2);
}
void GPIO_Motor_Init(void){
    MAP_GPIO_setAsOutputPin(
            GPIO_PORT_P6,
            GPIO_PIN0
            );
    MAP_GPIO_setAsOutputPin(
            GPIO_PORT_P5,
            GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2
            );
    MAP_GPIO_setAsOutputPin(
            GPIO_PORT_P3,
            GPIO_PIN5
            );
    MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P6, GPIO_PIN0);

}

void PWM_config(double Left_cycle,double Right_cycle){

    if(Left_cycle > 0){
        MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P5, GPIO_PIN1);
        MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P3, GPIO_PIN5);

    }
    else {
        MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P5, GPIO_PIN1);
        MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P3, GPIO_PIN5);
    }
    pwmConfig1.dutyCycle = abs(Left_cycle);
    MAP_Timer_A_generatePWM(TIMER_A0_BASE, &pwmConfig1);

    if(Right_cycle > 0){
        MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P5, GPIO_PIN0);
        MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P5, GPIO_PIN2);
    }
    else {
        MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P5, GPIO_PIN0);
        MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P5, GPIO_PIN2);
    }
    pwmConfig2.dutyCycle = abs(Right_cycle);
    MAP_Timer_A_generatePWM(TIMER_A0_BASE, &pwmConfig2);
}

my_pwm.h

/*
 * my_PWM.H
 *
 *  Created on: 2021年7月29日
 *      Author: Administrator
 */

#ifndef MY_PWM_H_
#define MY_PWM_H_

#include <ti/devices/msp432p4xx/driverlib/driverlib.h>

void PWM_Init(void);
void GPIO_Motor_Init(void);
void PWM_config(double Left_cycle,double Right_cycle);
#endif /* MY_PWM_H_ */

mian.c

#include <ti/devices/msp432p4xx/driverlib/driverlib.h>

/* Standard Includes */
#include <MPU6050.H>
#include <my_PWM.H>
#include <my_uart.h>
#include <delay.h>
#include <stdint.h>
#include <stdbool.h>
int main(void){
    MAP_WDT_A_holdTimer();
    PWM_Init();
    GPIO_Motor_Init();
    int i;             
    while(1){
    for(i = 0; i <= 3200; i = i + 100){
         PWM_config( i , -i);
          delay_ms(50);   
    }
  }  
}

 

   

 

    

 

 

 

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM