历史上的今天
今天是:2025年12月21日(星期日)
2022年12月21日 | 使用msp432搭建的平衡小车(一)
2022-12-21 来源:zhihu
1、前言
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 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 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 /* Standard Includes */ #include #include #include #include #include #include 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新手入坑
史海拾趣
|
微波系统的设计越来越复杂,对电路的指标要求越来越高,电路的功能越来越多,电路的尺寸要求越做越小,而设计周期却越来越短。传统的设计方法已经不能满足系统设计的需要,使用微波EDA软件工具进行微波元器件与微波系统的设计已经成为微波电路设计 ...… 查看全部问答> |
|
老师以上是我们这一组编写的与步进有关的程序,其中让两个步进电机同步的程序有问题。问题是:a电机正常转动,b电机只发出声音,但不转动。 老师,我是按你的方法写的,你帮我分析一下问题的所在。… 查看全部问答> |
|
中兴通讯硬件一部巨作-信号完整性 近年来,通讯技术、计算机技术的发展越来越快,高速数字电路在设计中的运用越来越多,数字接入设备的交换能力已从百兆、千兆发展到几十千兆。高速数字电路设计对信号完整性技术的需求越来越迫切。 在中、大规模 ...… 查看全部问答> |
|
造型请教:有没有可以查询FPGA/CPLD芯片的价格查询网址? 现在在选型FPGA,要用到161个IO,编数组功能单元。 公司没有BGA焊接设备,只能焊引脚能看到的封装 打算用Virtex的,两个TQ144封装的(IO=2*98),或者一个PQ240的(IO=166) 不知道这几种贵不贵,考虑成本,想用几百元的! … 查看全部问答> |
|
如何在wince6.0 中 使用wmvdmo 边录制视频边压缩? 我在wince6.0下开发了一个摄像软件,利用组件中的wmvdmo视频编码器,利用directshow编程。发现实现的是一次性录入然后一次性编码。这样,每次录完后要等好长时间才编码完,并且录制时间长一点就耗尽了内存。不知道怎么来实现边录制边压缩。望高手指 ...… 查看全部问答> |
|
代码如下: #include #include \"intrins.h\" sbit led = P2^0; #define uchar unsigned char #define uint unsigned int typedef unsigned char BYTE; typedef unsigned &n ...… 查看全部问答> |
|
【TI原创】采用8962实现串口服务器(ucosii+lwip) 引言 本研究设计了一种采用LM3S8962构架的嵌入式服务器采集Zigbee节点上的传感器数据,通过以太网实时访问、监测、查询家居信息。实现由Zigbee 自组网的无线局域网到广域网的智能家居系统。传感器Zigbee节点往协调器发送数据,协调器通 ...… 查看全部问答> |
|
3700系列系统开关及万用表是吉时利公司推出的新一代平台,为开关和/或集成数字万用表(DMM)应用提供了解决方案。这款新的平台采用主机和分立卡模块方法,是在2700/2701/2750(Integra)以及7001/7002产品特性基础上构建的,大大提高了吞吐量、密度和 ...… 查看全部问答> |




