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 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】相关推荐
- STM32入门(四)PWM与电机驱动
STM32入门(四)PWM与电机驱动 一.PWM 所谓PWM,就是脉冲宽度调制技术,其具有两个很重要的参数:频率和占空比.频率,就是周期的倒数:占空比,就是高电平在一个周期内所占的比例.PWM方波的示 ...
- stm32+定时器PWM波+电机驱动+直流电机
利用stm32单片机控制直流电机. 硬件部分:stm32f103c8t6.TB6612电机驱动模块.直流减速电机 首先搞明白原理.例如一个12v的直流电机,在其两端接上12v的电压,电机会满额转动,转 ...
- GD32103系列 电机驱动项目总结
这次使用的GD系列的芯片来做电机的驱动.然后对使用GD芯片做个总结.这次做的是一个光伏机器人项目.主要用在光伏板上的机器人,通过驱动电机来清理光伏板. 1.PWM配置 电机驱动使用的是PWM波来驱动. ...
- ESP32 入门笔记03:PWM (ESP32 for Arduino IDE)
先导知识 ESP32 入门笔记01:开发板信息.开发环境搭建以及学资料准备 ESP32 入门笔记02: GPIO参考指南 ESP32 有一个 LED PWM 控制器,具有 16 个独立通道,可配置为生 ...
- 用树莓派做蜘蛛机器人,还是3D打印的!
关注.星标公众号,直达精彩内容 这个四足蜘蛛机器人以树莓派作为「大脑」,身躯和四肢由 3D 打印.无需定制电路板,初学者即可完成组装. 不仅如此,教程还包含一段将近一个小时的组装视频.这对于想了解树莓 ...
- 工科赛树莓派OpenCV寻迹小车
废话不多说直接上可用代码. 材料:减速电机和USB摄像头.树莓派4g8b 代码环境:python.opencv 新手要是没要gpio库的话可自行下载,方法太简单这里不多说. 内涵多种滤波处理可自己尝试 ...
- 视频教程-ARDUINO零基础入门教程【代码编程篇】-Arduino
ARDUINO零基础入门教程[代码编程篇] 精通各种单片机编程,有十年以上ARDUINO,51单片机/STM32/PIC/AVR编程,硬件设计,绘图,编程经验.熟悉各种常用传感器使用和物联网通讯 赵勇 ...
- 《常用控制电路》学习笔记——数字控制直流电动机调速电路
书中该节讲述的电路通过ADC芯片将电位器的阻值转换为电压量,然后使用单片机输出PWM进行电路控制.本电路也可扩展应用至需要模拟量输入与输出的场合. 目录 一.系统设计思路 二.各模块电路分析 2.1电 ...
- STM32项目-STM32智能小车-电子设计大赛-STM32cubemx-STM32f103c8t6STM32串口通信-
记录项目的详细制作过程,所以笔记很长,图很多.很多图不好CSDN搬运, 我把笔记放网盘或者自己根据资料下载 笔记网盘下载: 链接:https://pan.baidu.com/s/1Mk2EVIha7F ...
最新文章
- 外国教授在B站当UP主上课,网友直呼好家伙:滑铁卢大学《差分隐私》课程上线...
- AFNetworking 3.0 源码解读(一)之 AFNetworkReachabilityManager
- NGINX Plus 提供的在线活动监控功能
- 几个不错的自己到的少的游戏站
- ASP.NET Core 中断请求了解一下(翻译)
- 前端学习(1527):过渡---文档分析
- 微型计算机除具有计算机的一般特点外,10秋学期《计算机应用基础》第1次在线作业答案免费6/15...
- 飞鸽传书2011绿色版简单性
- element-UI栅格系统缩放,导致页面布局效果bug? 叠加?错位?
- 判断端口是否能用_扫描器篇(八)之python+scapy构造TCP协议包扫描主机端口
- Nginx源码阅读笔记-内存池的设计
- Proxmox VE2.2虚拟化安装配置学习笔记(三)
- Android小知识10则(下)
- LIRe 源代码分析 5:提取特征向量[以颜色布局为例]
- 服务器自动几点重启php,windows下apache及mysql定时自动重启服务器定时自动重启...
- Java程序崩溃原因分析:错误日志分析及解决(Cannot allocate memory)
- 魔兽半月谈——NSL全灭 国手需自强
- 计算机考研初试350分什么水平,考研分数,考研350分什么水平!
- Unity入门03——Unity脚本
- gbk编解码器无法解码的问题,有可能出题出在文件名上
热门文章
- java get请求 302_HTTP 302错误和HTTP 404错误浅析
- 第三百四十六章 四相环
- linux编译python语言指令_Python实现Linux命令xxd -i功能
- html怎么使用element ui,element-ui是什么,以及element-ui如何使用
- Android 添加、移除桌面快捷方式图标
- linux———centos下安装redis(快捷方式)
- 2021年古城中学高考成绩查询,丽江古城第一高级中学2021年排名
- 2017年3月11 12 长途绕圈台山海边练车总结
- CSGO游戏辅助的现实教程-自瞄
- C++运算符重载(超全)