06:PWM与电机驱动【MSP430F5529】

这篇具有很好参考价值的文章主要介绍了06:PWM与电机驱动【MSP430F5529】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

电机型号:

工作方式:

原理图以及接线:

根据官方例程,主要代码为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

#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文章来源地址https://www.toymoban.com/news/detail-552933.html

/*
 * 第四个版本
 * 红外循迹四轮小车,旋转式转向,可前进与倒退
 *
 * 下一个版本改进计划:
 *          小车改为两个PWM驱动
 *          添加输入捕获,更新为闭环控制
 *          添加PID算法,运动控制更稳定
 *          修改定时器工作方式,精确计算时间,计算行驶路程
 *          添加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模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MSP430F5529——中断理解

    认识低功耗模式; MSP430的中断,需要两个部分,一部分是打开中断,另外一部分是编写中断服务函数 首先我们得知道__bis_SR_register和_BIS_SR是一个玩意。查看宏定义可知  _BIS_SR()可传入的参数 然后我们查看x的值,发现里面有八个可以传入的值 我们这里只需要关系GIE就可以

    2024年02月16日
    浏览(58)
  • 05:OLED模块【MSP430F5529】

    目录 实物图 字模取字         字模软件         取模步骤         1.设置软件         2.取模         3.输出数据  代码 type.h oledfont.h oled.h oled.c main.c 下面图片中,可以看到OLED模块的四个接口:GND,VCC,SCL,SDA GND VCC SCL SDA 接地 接电源3.3V/5V 接P3.5 接P3.6       

    2024年02月16日
    浏览(49)
  • MSP430F5529库函数学习——串口

    波特率计算网站;导入MSP430Ware,查看例程;原理图和中文开发手册获取 目录 GPIO_setAsPeripheralModuleFunctionInputPin()和GPIO_setAsPeripheralModuleFunctionOutputPin 函数声明  作用 参数 selectedPort selectedPins 使用 USCI_A_UART_init() 函数声明  作用 参数 baseAddress param  USCI_A_UART_enable() 函数

    2024年02月16日
    浏览(70)
  • MSP430F5529学习笔记(6)——导入MSP430Ware,查看例程

    MSP430WARE下载; 目录 在线版本 下载MSP430Ware 查看例程 导入例程  离线版本 下载MSP430Ware  查看例程 导入例程 MSP430Ware里面有很多例程和库函数使用手册,我们可以查看学习。非常重要 (1) 打开CCS——view——Resource Explorer  之后我们会进入如下界面 (2)  点击MSP430——Embe

    2024年02月13日
    浏览(58)
  • msp430f5529学习笔记(2)时钟系统

    写在前~本章将会详细的讲解msp430f5529单片机的时钟系统及其使用方法。如有不妥的地方欢迎各位大佬斧正!!! 目录 什么是时钟系统和时钟源 MSP430f5529时钟源和时钟系统介绍 产生时钟信号的时钟源: 时钟配置        在单片机中,单片机每开始一个周期的工作就需要一个节

    2024年02月17日
    浏览(48)
  • MSP430F5529库函数GPIO学习

    导入MSP430Ware,查看例程;数据手册以及原理图获取 建议不是很了解寄存器的看完我的MSP430F5529学习笔记  目录 GPIO_setAsOutputPin() 函数声明 作用 参数 selectedPort selectedPins 修改的寄存器 使用 与GPIO_setAsOutputPin()参数一致的函数  GPIO_setOutputHighOnPin() GPIO_setOutputLowOnPin()

    2024年02月15日
    浏览(70)
  • MSP430F5529学习笔记(五)——串口|UART

            我们在使用MSP430的时候大家会发现插上usb线后电脑上有两个端口标识,那么在进行串口通信时选择哪个呢。其实如图所示,上面的端口是用来进行串口通信的,下面的则是用来进行程序的下载,大家在使用的时候多加分辨即可。          当然熟悉单片机操作的

    2024年02月16日
    浏览(50)
  • 【2023电赛备赛】msp430f5529学习笔记(一)

    【写在前】 本人目前是大二在读生,第一次参加电赛,准备不充分,结果熬了四天,最后成绩却不如人意。有51和32的基础,然后想立一个flag系统的学习一下主打超低功耗的msp430f5529单片机为比赛做准备(毕竟电赛限制TI的板子)。另一方面也是给电协的后继者留下一些参考的

    2024年02月11日
    浏览(50)
  • MSP430F5529单片机入门学习笔记1

    本笔记整理自B站教程 MSP430F5529单片机学习视频汇总 右边部分写错了,看的时候注意 注意#include“driverlib.h”头文件时要注意: 添加MSP430F5xx_6xx文件夹到当前工程下 MSP430F5xx_6xx文件夹是在导入的msp430ware_3_80_13_03包中找 把上述MSP430F5xx_6xx文件夹的路径包含进来 有三个系统时钟可

    2024年02月06日
    浏览(50)
  • MSP430F5529循迹小车 2022电赛 C题

    编辑时间2022/8/21 选用材料:主控MSP430F5529、直流减速电机(带光电编码器)、TB6612电机驱动、超声波测距、灰度传感器、无线透传、OLED屏显示。 使用灰度传感器巡线,超声波检测前后车距作为位置环反馈,通过位置环调节前后车距离。 :MSP430   循迹    无线串口透

    2024年02月16日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包