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搭建的平衡小车(一)的更多相关文章

  1. 两轮自平衡小车双闭环PID控制设计

                                                                                            两轮自平衡小车的研究意义 ...

  2. msp432搭建平衡小车(二)

    前言 上一节掌握了使用pwm驱动电机,接下来介绍如何使用msp432读取mpu6050数据 正文 首先我们得知道mpu6050通信方式,由于mpu6050只能用i2c通信,所以学会使用msp432的i ...

  3. 玩转X-CTR100 l 平台-4WD智能小车

    我造轮子,你造车,创客一起造起来!更多塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍使用X-CTR100控制器搭建4WD智能 ...

  4. PID算法 旋转倒立摆与平衡车的区别。此贴后边会更新。

    我做PID算法的背景和经历:本人之前电子信息科学与技术专业,对控制方向颇感兴趣,刚上大学时听到实验室老师说PID算法,那年在暑假集训准备全国电子设计竞赛,我正在练习做一个以前专科的题目,帆板角度控制系 ...

  5. 安卓APP与智能硬件相结合的简易方案

    第1章 概  述 (作者小波QQ463431476) (来源http://blog.chinaaet.com/zhaocundang/p/5100017645博客) (来源   http://www. ...

  6. 用HAL库结合STM cube编写代码控制stm32f103c8t6来驱动减速电机实现慢快逐步切换转动

    用到的模块 TB6612FNG电机驱动模块 stm32F103C8T6最小系统板 LM2596S降压模块 直流减速电机(不涉及编码器知识) 模块介绍 1.TB6612FNG电机驱动模块 (1)< ...

  7. BluetoothChat用于蓝牙串口通信的修改方法

    本人最近在研究嵌入式的串口通信,任务是要写一个手机端的遥控器用来遥控双轮平衡小车.界面只用了一个小时就写好了,重要的问题是如何与板子所带的SPP-CA蓝牙模块进行通信. SPP-CA模块自带代码,在这 ...

  8. 【NetDIY智能主控】开发计划

    经过一个轮回,硬件开发.硬件创业又被推到了历史的前台. 面向低端.初级的硬件爱好者,以Arduino和81单片开发板为核心的开源硬件越来越深入人心,参与的人群越来越多,相关硬件和周边模块也越来越便宜. ...

  9. PID算法笔记2

    总所周知,PID算法是个很经典的东西.而做自平衡小车,飞行器PID是一个必须翻过的坎.因此本节我们来好好讲解一下PID,根据我在学习中的体会,力求通俗易懂.并举出PID的形象例子来帮助理解PID.一. ...

随机推荐

  1. Java核心基础第4篇-Java数组的常规操作

    Java数组 一.数组简介 数组是多个相同类型数据的组合,实现对这些数据的统一管理 数组属引用类型,数组型数据是对象(Object) 数组中的元素可以是任何数据类型,包括基本类型和引用类型 数组类型是 ...

  2. QT从入门到入土(一)——Qt5.14.2安装教程和VS2019环境配置

    引言 24岁的某天,承载着周围人的关心,一路南下.天晴心静,听着斑马,不免对未来有些彷徨.但是呢,人生总要走陌生的路,看陌生的风景,所幸可以听着不变的歌,关心自己的人就那么多.就像是对庸常生活的一次越 ...

  3. 小白都能理解的TCP三次握手四次挥手

    前言 TCP在学习网络知识的时候是经常的被问到知识点,也是程序员必学的知识点,今天小杨用最直白的表述带大家来认识认识,喜欢的朋友记得点点关注哈. 何为TCP 上点官方的话:是一种面向连接(连接导向)的 ...

  4. 5000字2021最新Python基础知识第一阶段:数据类型

    1 编程规范 注释 python注释也有自己的规范,在文章中会介绍到.注释可以起到一个备注的作用,团队合作的时候,个人编写的代码经常会被多人调用,为了让别人能更容易理解代码的通途,使用注释是非常有效的 ...

  5. 没事就要多做多练,Shell脚本循环例题做一做

    Shell脚本循环例题                 一.示例1                 二.示例2                 三.示例3                 四.示例4 ...

  6. C语言:最大公约数和最小公倍数

    #include <stdio.h> int main() { int a,b,c,m,t; printf("请输入两个数:\n"); scanf("%d%d ...

  7. 【LeetCode】12. 整数转罗马数字

    12. 整数转罗马数字 知识点:字符串 题目描述 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 100 ...

  8. 在deeping上安装mariadb

    1,安装的官网参考:有安装的命令和指导https://downloads.mariadb.org/mariadb/repositories/#distro=Debian&distro_rele ...

  9. Python+pytest知识点回顾

    pip install pytest pytest 单元测试框架 pytest高于unittest测试框架 unittest测试类需要继承unittest.TestCase类 pytest不需要继承, ...

  10. 【洛谷P2028 龙兄摘苹果】动态规划

    分析 第二类striling数 考虑最后一个数到底是放在之前的任意一个集合内,还是自成一个集合 \[F_{i\ j}=F_{i-1\ j-1}+j\times F_{i-1,j} \] AC代码 #i ...