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. NB-IoT物联网连接

    一.NB-1oT的专有能力物联网(Internet of Things).简称IoTNB-IoT就是指窄带物联网(Narrow Band-Internet of Things)技术目前关于NB-IoT ...

  2. LeetCode解题记录(双指针专题)

    1. 算法解释 双指针主要用于遍历数组,两个指针指向不同的元素,从而协同完成任务.也可以延伸到多个数组的多个指针. 若两个指针指向同一数组,遍历方向相同且不会相交,则也称为滑动窗口(两个指针包围的区域 ...

  3. 第 3 题:如何理解 HTML5 语义化?

    什么是标签语义化? 提升代码可读性,便于团队开发和维护 为什么要标签语义化? 当网页去掉 CSS 样式时,页面能呈现出来清晰的结构 案例 不存在语义化 <div></div> ...

  4. [刘阳Java]_CSS数字分页效果

    先给出效果图,见下图.下图主要的完成当鼠标放到分页数字的上会呈现一个变大的效果 实现思路: (1). 使用浮动属性,以便让li元素水平排列. (2).将a元素设置为块级元素,然后设置它们的尺寸. (3 ...

  5. python + mysql 实现创建数据表

    import pymysql"""1.连接本地数据库2.建立游标3.创建表4.插入表数据.查询表数据.更新表数据.删除表数据"""def c ...

  6. Spring解决Attribute tx bound to namespace httpwww.w3.org2000xmlns was already specified

    Spring|解决Attribute "tx" bound to namespace "http://www.w3.org/2000/xmlns/" was a ...

  7. Skywalking-03:Skywalking本地调试

    live-demo 与 skywalking 源码联调 构建项目 找一个目录执行如下命令 git clone https://github.com/apache/skywalking.git # cl ...

  8. Vmware 虚拟机网络通讯

    VMware Workstation(中文名"威睿工作站")是一款功能强大的桌面虚拟计算机软件,提供用户可在单一的桌面上同时运行不同的操作系统,和进行开发.测试 .部署新的应用程序 ...

  9. spring.jpa.open-view问题

    由ReentrantLock和JPA(spring.jpa.open-in-view)导致的死锁问题原因分析. 问题 在压测过程中,发现服务经过一段时间压测之后出现无响应,且无法自动恢复. 分析 从上 ...

  10. Tom_No_02 Servlet向流中打印内容,之后在调用finsihResponse,调用上是先发送了body,后发送Header的解释

    上次在培训班学上网课的时候就发现了这个问题,一直没有解决,昨天又碰到了,2-3小时也未能发现点端倪,今早又仔细缕了下,让我看了他的秘密 1.Servlet向流中打印内容,之后在调用finsihResp ...