使用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.一. ...
随机推荐
- Java on Visual Studio Code的更新 – 2021年6月
Nick Zhu from Microsoft VS Code Java Team 大家好,欢迎来到 Visual Studio Code Java 更新的特别年中版.作为这篇文章的重点,我们将看看接 ...
- 「Ynoi2015」我回来了
「Ynoi2015」我回来了 这东西已经不是 Ynoi 了,因为太水被嫌弃了. 如何提升自己的数据结构能力?从Ynoi做起 题目链接 其实这个题很小清新的辣,而且不卡常. 由于边权为 \(1\),所以 ...
- 从源码角度谈谈MySQL "Too many open files"错误的根本原因
"Too many open files"是一个比较常见的错误,不仅仅是在 MySQL 中.只要是在 Linux 中启动的进程,都有可能遇到这个错误. 究其原因,是进程打开的文件描 ...
- Springboot中Rest风格请求映射如何开启并使用
问题引入 因为前端页面只能请求两种方式:GET请求和POST请求,所以就需要后台对其进行处理 解决办法:通过springmvc中提供的HiddenHttpMethodFilter过滤器来实现 而由于我 ...
- Linux相关网络命令大全 网络接口 域名分析
Linux网络设置一.查看网络接口信息ifconfig① 查看所有活动的网络接口信息② 查看指定网络接口信息补充二.查看主机名称hostname① hostname命令② 永久设置主机名三.查看路由表 ...
- C语言:体现\r的结果
#include <stdio.h> #include <windows.h> //体现\r的结果 //转义字符\r,回车,将光标移动到当前行最开始 main() { char ...
- 团队开发day01
进行了项目的划分,负责开发android端的登录注册,网页端的登录注册, 以及服务器端的数据处理,请求响应 第一天任务:编写登录和注册的UI 遇到问题:对android的布局存在不了解,放置的图片lo ...
- CF1329F题解
能发现: 1.输出序列与掉落顺序没有任何关系(因为单调性不会被改变). 2.输出的序列 \(h_i\) 最多有一组 \(h_i=h_{i+1}\). 对 2 的证明: 当 \(h_{i+1}\) 与 ...
- Spring框架中一个有用的小组件:Spring Retry
1.概述 Spring Retry 是Spring框架中的一个组件, 它提供了自动重新调用失败操作的能力.这在错误可能是暂时发生的(如瞬时网络故障)的情况下很有帮助. 在本文中,我们将看到使用Spri ...
- 【LeetCode】151. 翻转字符串里的单词(剑指offer 58-I)
151. 翻转字符串里的单词 知识点:字符串:双指针 题目描述 给你一个字符串 s ,逐个翻转字符串中的所有 单词 . 单词 是由非空格字符组成的字符串.s 中使用至少一个空格将字符串中的 单词 分隔 ...