使用msp432搭建的平衡小车(一)
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);
}
}
}
使用msp432搭建的平衡小车(一)的更多相关文章
- 两轮自平衡小车双闭环PID控制设计
两轮自平衡小车的研究意义 ...
- msp432搭建平衡小车(二)
前言 上一节掌握了使用pwm驱动电机,接下来介绍如何使用msp432读取mpu6050数据 正文 首先我们得知道mpu6050通信方式,由于mpu6050只能用i2c通信,所以学会使用msp432的i ...
- 玩转X-CTR100 l 平台-4WD智能小车
我造轮子,你造车,创客一起造起来!更多塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍使用X-CTR100控制器搭建4WD智能 ...
- PID算法 旋转倒立摆与平衡车的区别。此贴后边会更新。
我做PID算法的背景和经历:本人之前电子信息科学与技术专业,对控制方向颇感兴趣,刚上大学时听到实验室老师说PID算法,那年在暑假集训准备全国电子设计竞赛,我正在练习做一个以前专科的题目,帆板角度控制系 ...
- 安卓APP与智能硬件相结合的简易方案
第1章 概 述 (作者小波QQ463431476) (来源http://blog.chinaaet.com/zhaocundang/p/5100017645博客) (来源 http://www. ...
- 用HAL库结合STM cube编写代码控制stm32f103c8t6来驱动减速电机实现慢快逐步切换转动
用到的模块 TB6612FNG电机驱动模块 stm32F103C8T6最小系统板 LM2596S降压模块 直流减速电机(不涉及编码器知识) 模块介绍 1.TB6612FNG电机驱动模块 (1)< ...
- BluetoothChat用于蓝牙串口通信的修改方法
本人最近在研究嵌入式的串口通信,任务是要写一个手机端的遥控器用来遥控双轮平衡小车.界面只用了一个小时就写好了,重要的问题是如何与板子所带的SPP-CA蓝牙模块进行通信. SPP-CA模块自带代码,在这 ...
- 【NetDIY智能主控】开发计划
经过一个轮回,硬件开发.硬件创业又被推到了历史的前台. 面向低端.初级的硬件爱好者,以Arduino和81单片开发板为核心的开源硬件越来越深入人心,参与的人群越来越多,相关硬件和周边模块也越来越便宜. ...
- PID算法笔记2
总所周知,PID算法是个很经典的东西.而做自平衡小车,飞行器PID是一个必须翻过的坎.因此本节我们来好好讲解一下PID,根据我在学习中的体会,力求通俗易懂.并举出PID的形象例子来帮助理解PID.一. ...
随机推荐
- Fiddler大全之断点操作
打断点(bpu) 1.为什么要打断点呢?比如一个购买的金额输入框,输入框前端做了限制100-1000,那么我们测试的时候,需要测试小于100的情况下.很显然前端只能输入大于100的.这是我们可以先抓到 ...
- Leetcode No.1 Two Sum(c++哈希表实现)
1. 题目 1.1 英文题目 Given an array of integers nums and an integer target, return indices of the two numb ...
- LVM拓展报错及处理
LVM拓展报错: root@ming:/# lvextend -L +100G /dev/ubuntu-vg/root Insufficient free space: 25600 extents ...
- 我的Linux发行版选择
Ubuntu CentOS Debian Fedora Slackware Mint Xubuntu Arch OpenSUSE Red Hat Slackel PureOS Mageia PCLin ...
- DataFrame的创建
DataFrame的创建从Spark2.0以上版本开始,Spark使用全新的SparkSession接口替代Spark1.6中的SQLContext及HiveContext接口来实现其对数据加载.转换 ...
- 自动执行文件夹中的py文件
写一个函数,接收一个地址,执行其中的py文件,包括子文件.path.endswith('.py') 判断以'.py'结尾,是什么类型的文件.os.system('python %s'%path) 模拟 ...
- Shiro精通学习——【第一集:入门】
入门: main方法直接执行:https://blog.csdn.net/a907691592/article/details/80559904 使用配置文件方式:https://blog.csdn. ...
- 如何用css画一个彩虹---v客学院技术分享
无意间看到了CSS radial-gradient() 函数实现了如下图的样式 仔细一看还真有点像灯光下的鸡蛋,O(∩_∩)O哈哈~ 今天我就来用radial-gradient()函数教大家画一个简单 ...
- 微信小程序云开发-云函数-云函数实现数据的查询、修改和删除功能
一.云函数获取商品信息 1.创建云函数getData,云函数功能:获取商品信息 2.在本地小程序页面调用云函数getData 二.云函数修改商品信息 1.创建云函数updateData,云函数功能: ...
- Cookie学习总结
Cookie简述 1. 概念 一种客户端会话技术,可以将一些少量的数据保存在客户端. 2. 快速使用 步骤 创建cookie对象,并设定数据 new Cookie(String name, Strin ...