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); } } }