电机型号:

工作方式:

原理图以及接线:

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

/** 第四个版本* 红外循迹四轮小车,旋转式转向,可前进与倒退** 下一个版本改进计划:*          小车改为两个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);      //0P6OUT |= BIT1 + BIT3 + BIT6;                //1P7OUT |= BIT0;break;case 1://后退P6OUT |= BIT0 + BIT2 + BIT4 + BIT5;     //1P6OUT &= ~(BIT1 + BIT3 + BIT6);         //0P7OUT &= ~BIT0;                         //0break;case 2://左转P6OUT &= ~BIT0;      //0,P6.0P6OUT &= ~BIT1;      //0P6OUT &= ~BIT2;      //0,P6.2P6OUT |= BIT3;       //1P6OUT &= ~BIT4;      //0,P6.4P7OUT &= ~BIT0;      //0P6OUT &= ~BIT5;      //0P6OUT |= BIT6;       //1break;case 3://右转P6OUT &= ~BIT0;      //0P6OUT |= BIT1;       //1P6OUT &= ~BIT2;      //0P6OUT &= ~BIT3;      //0P6OUT &= ~BIT4;      //0P7OUT |= BIT0;       //1P6OUT &= ~BIT5;      //0P6OUT &= ~BIT6;      //0break;case 4://停止P6OUT &= ~(BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6);      //0P7OUT &= ~BIT0;break;case 5://左旋转P6OUT &= ~BIT0;      //0P6OUT |=  BIT1;      //1P6OUT |=  BIT2;      //1P6OUT &= ~BIT3;      //0P6OUT &= ~BIT4;      //0P7OUT |=  BIT0;      //1P6OUT |=  BIT5;      //1P6OUT &= ~BIT6;      //0break;case 6://右旋转P6OUT |=  BIT0;      //1P6OUT &= ~BIT1;      //0P6OUT &= ~BIT2;      //0P6OUT |=  BIT3;      //1P6OUT |=  BIT4;      //1P7OUT &= ~BIT0;      //0P6OUT &= ~BIT5;      //0P6OUT |=  BIT6;      //1break;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】相关推荐

  1. STM32入门(四)PWM与电机驱动

    STM32入门(四)PWM与电机驱动 一.PWM 所谓PWM,就是脉冲宽度调制技术,其具有两个很重要的参数:频率和占空比.频率,就是周期的倒数:占空比,就是高电平在一个周期内所占的比例.PWM方波的示 ...

  2. stm32+定时器PWM波+电机驱动+直流电机

    利用stm32单片机控制直流电机. 硬件部分:stm32f103c8t6.TB6612电机驱动模块.直流减速电机 首先搞明白原理.例如一个12v的直流电机,在其两端接上12v的电压,电机会满额转动,转 ...

  3. GD32103系列 电机驱动项目总结

    这次使用的GD系列的芯片来做电机的驱动.然后对使用GD芯片做个总结.这次做的是一个光伏机器人项目.主要用在光伏板上的机器人,通过驱动电机来清理光伏板. 1.PWM配置 电机驱动使用的是PWM波来驱动. ...

  4. ESP32 入门笔记03:PWM (ESP32 for Arduino IDE)

    先导知识 ESP32 入门笔记01:开发板信息.开发环境搭建以及学资料准备 ESP32 入门笔记02: GPIO参考指南 ESP32 有一个 LED PWM 控制器,具有 16 个独立通道,可配置为生 ...

  5. 用树莓派做蜘蛛机器人,还是3D打印的!

    关注.星标公众号,直达精彩内容 这个四足蜘蛛机器人以树莓派作为「大脑」,身躯和四肢由 3D 打印.无需定制电路板,初学者即可完成组装. 不仅如此,教程还包含一段将近一个小时的组装视频.这对于想了解树莓 ...

  6. 工科赛树莓派OpenCV寻迹小车

    废话不多说直接上可用代码. 材料:减速电机和USB摄像头.树莓派4g8b 代码环境:python.opencv 新手要是没要gpio库的话可自行下载,方法太简单这里不多说. 内涵多种滤波处理可自己尝试 ...

  7. 视频教程-ARDUINO零基础入门教程【代码编程篇】-Arduino

    ARDUINO零基础入门教程[代码编程篇] 精通各种单片机编程,有十年以上ARDUINO,51单片机/STM32/PIC/AVR编程,硬件设计,绘图,编程经验.熟悉各种常用传感器使用和物联网通讯 赵勇 ...

  8. 《常用控制电路》学习笔记——数字控制直流电动机调速电路

    书中该节讲述的电路通过ADC芯片将电位器的阻值转换为电压量,然后使用单片机输出PWM进行电路控制.本电路也可扩展应用至需要模拟量输入与输出的场合. 目录 一.系统设计思路 二.各模块电路分析 2.1电 ...

  9. STM32项目-STM32智能小车-电子设计大赛-STM32cubemx-STM32f103c8t6STM32串口通信-

    记录项目的详细制作过程,所以笔记很长,图很多.很多图不好CSDN搬运, 我把笔记放网盘或者自己根据资料下载 笔记网盘下载: 链接:https://pan.baidu.com/s/1Mk2EVIha7F ...

最新文章

  1. 外国教授在B站当UP主上课,网友直呼好家伙:滑铁卢大学《差分隐私》课程上线...
  2. AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilityManager
  3. NGINX Plus 提供的在线活动监控功能
  4. 几个不错的自己到的少的游戏站
  5. ASP.NET Core 中断请求了解一下(翻译)
  6. 前端学习(1527):过渡---文档分析
  7. 微型计算机除具有计算机的一般特点外,10秋学期《计算机应用基础》第1次在线作业答案免费6/15...
  8. 飞鸽传书2011绿色版简单性
  9. element-UI栅格系统缩放,导致页面布局效果bug? 叠加?错位?
  10. 判断端口是否能用_扫描器篇(八)之python+scapy构造TCP协议包扫描主机端口
  11. Nginx源码阅读笔记-内存池的设计
  12. Proxmox VE2.2虚拟化安装配置学习笔记(三)
  13. Android小知识10则(下)
  14. LIRe 源代码分析 5:提取特征向量[以颜色布局为例]
  15. 服务器自动几点重启php,windows下apache及mysql定时自动重启服务器定时自动重启...
  16. Java程序崩溃原因分析:错误日志分析及解决(Cannot allocate memory)
  17. 魔兽半月谈——NSL全灭 国手需自强
  18. 计算机考研初试350分什么水平,考研分数,考研350分什么水平!
  19. Unity入门03——Unity脚本
  20. gbk编解码器无法解码的问题,有可能出题出在文件名上

热门文章

  1. java get请求 302_HTTP 302错误和HTTP 404错误浅析
  2. 第三百四十六章 四相环
  3. linux编译python语言指令_Python实现Linux命令xxd -i功能
  4. html怎么使用element ui,element-ui是什么,以及element-ui如何使用
  5. Android 添加、移除桌面快捷方式图标
  6. linux———centos下安装redis(快捷方式)
  7. 2021年古城中学高考成绩查询,丽江古城第一高级中学2021年排名
  8. 2017年3月11 12 长途绕圈台山海边练车总结
  9. CSGO游戏辅助的现实教程-自瞄
  10. C++运算符重载(超全)