電機型號:
工作方式:
原理圖以及接線:
根據官方例程,主要代碼為drive.c
#include <drive.h>
/*
* 函數:PWM_Init()
* 功能:初始化PWM
* P1.2
* P1.3
*/
void PWM_Init(void)
{
//TA0CTL = 0; //清除以前的設置
//TA0CTL = MC_1; //定時器TA選擇為增記數模式
TA0CTL |= ID_0; //設置分頻系數
/*設置PWM通道一P1.2的輸出模式*/
//TA0CCTL1 = OUTMOD_7; //高電平PWM輸出,占空比設置的是高電平的占空比
TA0CCTL1 = OUTMOD_3; //低電平PWM輸出,占空比設置的是低電平的占空比
P1DIR |= BIT2; //P1.2為輸出
P1SEL |= BIT2; //P1.2為輸出
/*設置PWM通道二P1.3的輸出模式*/
TA0CCTL2 = OUTMOD_7; //高電平PWM輸出
P1DIR |= BIT3; //P1.3為輸出
P1SEL |= BIT3; //P1.3為輸出
TA0CTL = TASSEL_2 + MC_1;
}
/*
* 函數:TAPwmSetPermill(char Channel,unsigned int Percent)
* 功能:設置每一路的參數
* 入口參數:
* Channel:當前設置的通道數
* Percent:PWM有效時間的千分比(0~1000)
*/
void TAPwmSetPermill(char Channel,unsigned int Percent)
{
unsigned long int Period;
unsigned int Duty;
Period = TA0CCR0;
Duty = Period * Percent /1000;
switch(Channel)
{
case 1:
TA0CCR1 = Duty;
break;
case 2:
TA0CCR2 = Duty;
break;
case 3:
TA0CCR3 = Duty;
break;
case 4:
TA0CCR4 = Duty;
break;
}
}
drive.h
#ifndef __DRIVE_H
#define __DRIVE_H
#include <msp430.h>
#include <stdio.h>
void PWM_Init(void);
void TAPwmSetPermill(char Channel,unsigned int Percent);
#endif
main.c
/*
* 通道1:P1.2
* 通道2:P1.3
* 通道1輸出PWM信號,200HZ,20%占空比
*/
#include <msp430.h>
#include <drive.h>
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
PWM_Init();
TA0CCR0 = 5000;
TAPwmSetPermill(1,400); //1通道,40%的占空比
TAPwmSetPermill(2,500); //2通道,50%的占空比
while(1);
}
(后面好像使用的時候會有什么沖突導致1或者2通道無法正常運行,不太記得了,可以到實物上實驗一下子)
下面是智能送藥小車使用PWM驅動電機相關代碼與注釋(在實物中,均能正常運行)
car.h
#ifndef __CAR_H
#define __CAR_H
#include <msp430.h>
void CAR_PWM_Init(void);
void CAR_RUN_Init(void);
void Capture_Init(void);
void CAR_Init(void);
void TAPwmSetPermill(char Channel,unsigned int Percent);
#endif
car.c文章來源:http://www.zghlxwxcb.cn/news/detail-552933.html
#include <car.h>
/*******************************
* PWM初始化
* 前輪: 左——P1.2 右——P1.3
* 后輪: 左——P1.4 右——P1.5
*******************************/
void CAR_PWM_Init()
{
TA0CTL |= ID_0;
P1DIR |= BIT2 + BIT3 + BIT4 + BIT5;
P1SEL |= BIT2 + BIT3 + BIT4 + BIT5;
TA0CCTL1 = OUTMOD_7;
TA0CCTL2 = OUTMOD_7;
TA0CCTL3 = OUTMOD_7;
TA0CCTL4 = OUTMOD_7;
TA0CTL = TASSEL_2 + MC_1 + TACLR;
TA0CCR0 = 1000;
}
/*
* 電機控制端GPIO設置
* AIN1 AIN2
* 左前 P6.0 P6.1
* 右前 P6.2 P6.3
* 左后 P6.4 P7.0
* 右后 P6.5 P6.6
*/
void CAR_RUN_Init(void)
{
P6DIR |= BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6;
P6OUT &= ~(BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6);
P7DIR |= BIT0;
P7OUT &= ~BIT0;
}
/***************************
* 輸入捕獲:
* 前輪: 左——P2.0 右——P2.1
* 后輪: 左——P2.2 右——P3.6
***************************/
//IO口存在沖突,待改進,改為兩個PWM以及兩個輸入捕獲端口,解決定時器不足問題
/*void Capture_Init(void)
{
P2DIR &= ~(BIT4 + BIT5);
P2SEL |= BIT4 + BIT5;
TA2CTL = MC_2 + TASSEL_2 + ID_0 + TACLR;
TA2CCTL1 = CM_1 + SCS + CAP + CCIE + CCIS_0;
TA2CCTL2 = CM_1 + SCS + CAP + CCIE + CCIS_0;
P3DIR &= ~(BIT5 + BIT6);
P3SEL |= BIT5 + BIT6;
TB0CTL = MC_2 + TASSEL_2 + ID_0 + TACLR;
TB0CCTL1 = CM_1 + SCS + CAP + CCIE + CCIS_0;
TB0CCTL2 = CM_1 + SCS + CAP + CCIE + CCIS_0;
}*/
void CAR_Init(void)//初始化
{
CAR_PWM_Init();
CAR_RUN_Init();
//Capture_Init();
}
void TAPwmSetPermill(char Channel,unsigned int Percent)//選擇通道,設置該通道輸出的占空比,改變小車速度
{
unsigned long int Period;
unsigned int Duty;
Period = TA0CCR0;
Duty = Period * Percent /1000;
switch(Channel)
{
case 1:
TA0CCR1 = Duty;
break;
case 2:
TA0CCR2 = Duty;
break;
case 3:
TA0CCR3 = Duty;
break;
case 4:
TA0CCR4 = Duty;
break;
}
}
main.c文章來源地址http://www.zghlxwxcb.cn/news/detail-552933.html
/*
* 第四個版本
* 紅外循跡四輪小車,旋轉式轉向,可前進與倒退
*
* 下一個版本改進計劃:
* 小車改為兩個PWM驅動
* 添加輸入捕獲,更新為閉環(huán)控制
* 添加PID算法,運動控制更穩(wěn)定
* 修改定時器工作方式,精確計算時間,計算行駛路程
* 添加OLED,實時顯示參數
*/
#include <msp430.h>
#include <car.h>
#include <redled.h>
void delay(int ms);
void RED_LED_Flag(void);
void CAR_F_R(int mode_1);
void CAR_R_F(unsigned int a,unsigned int b,unsigned int c,unsigned int d);
void CAR_TEXT(void);
int main(void)
{
WDTCTL = WDTPW | WDTHOLD;
//RED_LED_Init();//開啟紅外功能,初始化
CAR_Init();
while(1)
{
//RED_LED_Flag();//開啟小車全部功能
CAR_TEXT();//測試小車功能
}
}
void CAR_TEXT(void)
{
CAR_R_F(200,200,200,200);
CAR_F_R(0);
}
//延時函數——偽
void delay(int ms)
{
int i,j;
for( i = 0; i < ms; i ++)
{
for( j = 0; j < 240; j ++);
}
}
void RED_LED_Flag(void) //小車功能實現
{
if( (P4IN & BIT1) != 0 && (P4IN & BIT2) != 0)//都識別到黑線
{
CAR_F_R(4); //停止
CAR_R_F(000,000,000,000);
}
if( (P4IN & BIT1) == 0 && (P4IN & BIT2) == 0)//都未識別到黑線
{
CAR_F_R(0); //前進
CAR_R_F(200,200,200,200);
}
if( (P4IN & BIT1) != 0 && (P4IN & BIT2) == 0)//左識別到黑線,左轉
{
CAR_F_R(6); //旋轉左轉
CAR_R_F(300,300,300,300);
}
if( (P4IN & BIT1) == 0 && (P4IN & BIT2) != 0)//右識別到黑線,右轉
{
CAR_F_R(5); //旋轉右轉
CAR_R_F(300,300,300,300);
}
}
void CAR_F_R(int mode_1)//控制前后行動,控制IN1,IN2
{
switch(mode_1)
{
case 0://前行
P6OUT &= ~(BIT0 + BIT2 + BIT4 + BIT5); //0
P6OUT |= BIT1 + BIT3 + BIT6; //1
P7OUT |= BIT0;
break;
case 1://后退
P6OUT |= BIT0 + BIT2 + BIT4 + BIT5; //1
P6OUT &= ~(BIT1 + BIT3 + BIT6); //0
P7OUT &= ~BIT0; //0
break;
case 2://左轉
P6OUT &= ~BIT0; //0,P6.0
P6OUT &= ~BIT1; //0
P6OUT &= ~BIT2; //0,P6.2
P6OUT |= BIT3; //1
P6OUT &= ~BIT4; //0,P6.4
P7OUT &= ~BIT0; //0
P6OUT &= ~BIT5; //0
P6OUT |= BIT6; //1
break;
case 3://右轉
P6OUT &= ~BIT0; //0
P6OUT |= BIT1; //1
P6OUT &= ~BIT2; //0
P6OUT &= ~BIT3; //0
P6OUT &= ~BIT4; //0
P7OUT |= BIT0; //1
P6OUT &= ~BIT5; //0
P6OUT &= ~BIT6; //0
break;
case 4://停止
P6OUT &= ~(BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6); //0
P7OUT &= ~BIT0;
break;
case 5://左旋轉
P6OUT &= ~BIT0; //0
P6OUT |= BIT1; //1
P6OUT |= BIT2; //1
P6OUT &= ~BIT3; //0
P6OUT &= ~BIT4; //0
P7OUT |= BIT0; //1
P6OUT |= BIT5; //1
P6OUT &= ~BIT6; //0
break;
case 6://右旋轉
P6OUT |= BIT0; //1
P6OUT &= ~BIT1; //0
P6OUT &= ~BIT2; //0
P6OUT |= BIT3; //1
P6OUT |= BIT4; //1
P7OUT &= ~BIT0; //0
P6OUT &= ~BIT5; //0
P6OUT |= BIT6; //1
break;
default:
break;
}
}
void CAR_R_F(unsigned int a,unsigned int b,unsigned int c,unsigned int d)//控制速度
{
TAPwmSetPermill(1,a);
TAPwmSetPermill(2,b);
TAPwmSetPermill(3,c);
TAPwmSetPermill(4,d);
}
到了這里,關于06:PWM與電機驅動【MSP430F5529】的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!