最近拿到了一块TI的MSP432E401Y板子,但是关于这款板子,官方给的资料实在是太少了,以至于学习起来比较头疼!!!
下面我介绍一下我学习四路PWM波控制电机的过程。
使用Keil5开发TI的板子也是可以的,前提是需要在TI的官网上下载一个支持的芯片包,下载链接https://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/msp432cmsis/latest/exports/TexasInstruments.MSP432E4_DFP.3.2.6.pack?tracked=1https://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/msp432cmsis/latest/exports/TexasInstruments.MSP432E4_DFP.3.2.6.pack?tracked=1
或者在我上传的资源里面也有:
安装好之后会keil里面会有一个芯片包的选择,注意对与MSP432E401Y这款板子,安装1.0版本的芯片包不可以,安装之后没有这个型号的芯片,要下载3.0版本的才可以!!!
由于板载上面自带下载器,所以外部我们不需要连接下载器,到这里keil编译TI板子的环境我们就搭建好了。
开始搭建库函数版本的开发方式,TI不像STM32,没有CubeMX给我们自动生成初始化内容,所以只能采用库函数和寄存器开发方式,在这我采用的库函数方式。
在网络上查阅了很多的资料,自己添加了一个关于这个芯片的库,我把链接放在下面了,
nullhttps://download.csdn.net/download/qq_62291061/88031455
一、PWM输出
下面就是来写四路PWM输出了,一般来说PWM输出,会有两种思路,用定时器去产生一个PWM波,或者是用自带的PWM波发生器来产生,两个方式都可以的,我这里采用的是PWM发生器来产生的。
基础配置
void PWM1_Init()
{
/* PWM外设必须启用才能使用. */
SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM0);
while(!(MAP_SysCtlPeripheralReady(SYSCTL_PERIPH_PWM0)));
/* 设置PWM时钟为系统时钟。 */
PWMClockSet(PWM0_BASE,PWM_SYSCLK_DIV_2);
/* 为PWM引脚使能GPIO端口F的时钟 */
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOF));
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG);
while(!SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOG));
GPIOPinConfigure(GPIO_PG0_M0PWM4);
GPIOPinConfigure(GPIO_PF3_M0PWM3);
GPIOPinConfigure(GPIO_PF2_M0PWM2);
GPIOPinConfigure(GPIO_PF1_M0PWM1);
GPIOPinTypePWM(GPIO_PORTF_BASE, (GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3));
GPIOPinTypePWM(GPIO_PORTG_BASE,(GPIO_PIN_0 | GPIO_PIN_1));
//关闭PWM Block以便正常配置相关参数
PWM0->_0_CTL&=~PWM_0_CTL_ENABLE;
/* 配置PWM0为向上/向下计数,不进行同步。 */
PWMGenConfigure(PWM0_BASE, PWM_GEN_0, PWM_GEN_MODE_UP_DOWN |
PWM_GEN_MODE_GEN_SYNC_LOCAL);
PWMGenConfigure(PWM0_BASE, PWM_GEN_1, PWM_GEN_MODE_UP_DOWN |
PWM_GEN_MODE_GEN_SYNC_LOCAL);
PWMGenConfigure(PWM0_BASE, PWM_GEN_2, PWM_GEN_MODE_UP_DOWN |
PWM_GEN_MODE_GEN_SYNC_LOCAL);
/* 设置PWM周期为250Hz。计算合适的参数N=(1/ f) * SysClk.
N = (1 / f)其中N是函数参数,
f为所需频率,SysClk为系统时钟频率。在这种情况下,
你得到:(1 / 250Hz) * 16MHz = 64000周期。请注意,
您可以设置的 最大周期是2^16 - 1。*/
PWMGenPeriodSet(PWM0_BASE, PWM_GEN_0, 64000);
PWMGenPeriodSet(PWM0_BASE, PWM_GEN_1, 64000);
PWMGenPeriodSet(PWM0_BASE, PWM_GEN_2, 64000);
/* PWM0 PF1占空比设置为75%。你把占空比设为
期间的功能。由于上面设置了句点,您可以使用
PWMGenPeriodGet()函数。对于这个例子,PWM将是高的
7%的时间或16000时钟周期3*(64000 / 4)。 */
/* 该定时器处于up-down模式。中断将发生时
计数器为这个PWM计数到负载值(64000),当
计数器计数到64000/4 (PWM A up),计数到64000/4
(PWM A Down),计数到0。 */
PWMGenIntTrigEnable(PWM0_BASE, PWM_GEN_0,
PWM_INT_CNT_ZERO | PWM_INT_CNT_LOAD |
PWM_INT_CNT_AU | PWM_INT_CNT_AD);
PWMGenIntTrigEnable(PWM0_BASE, PWM_GEN_1,
PWM_INT_CNT_ZERO | PWM_INT_CNT_LOAD |
PWM_INT_CNT_AU | PWM_INT_CNT_AD);
PWMGenIntTrigEnable(PWM0_BASE, PWM_GEN_2,
PWM_INT_CNT_ZERO | PWM_INT_CNT_LOAD |
PWM_INT_CNT_AU | PWM_INT_CNT_AD);
IntEnable(INT_PWM0_0);
IntEnable(INT_PWM0_1);
IntEnable(INT_PWM0_2);
PWMIntEnable(PWM0_BASE, PWM_INT_GEN_0);
PWMIntEnable(PWM0_BASE, PWM_INT_GEN_1);
PWMIntEnable(PWM0_BASE, PWM_INT_GEN_2);
/* 使能PWM0 Bit 0 (PF0)和Bit 1 (PF1)输出信号。*/
//PWMOutputState(PWM0_BASE, PWM_OUT_1_BIT | PWM_OUT_2_BIT , true);
/* 设置PWM0 PF0的占空比为25%。你把占空比设为
期间的功能。由于上面设置了句点,您可以使用
PWMGenPeriodGet()函数。对于这个例子,PWM将是高的
25%的时间或16000个时钟周期(64000 / 4)。 */
PWMPulseWidthSet(PWM0_BASE, PWM_OUT_1,
100*MAP_PWMGenPeriodGet(PWM0_BASE, PWM_GEN_0) / 100);//设置PWM的占空比,分为100等分
PWMPulseWidthSet(PWM0_BASE, PWM_OUT_2,
100*MAP_PWMGenPeriodGet(PWM0_BASE, PWM_GEN_1) / 100);
PWMPulseWidthSet(PWM0_BASE, PWM_OUT_3,
100*MAP_PWMGenPeriodGet(PWM0_BASE, PWM_GEN_2) / 100);
PWMPulseWidthSet(PWM0_BASE, PWM_OUT_4,
100*MAP_PWMGenPeriodGet(PWM0_BASE, PWM_GEN_3) / 100);
PWMOutputState(PWM0_BASE, (PWM_OUT_1_BIT | PWM_OUT_2_BIT |
PWM_OUT_3_BIT | PWM_OUT_4_BIT), true);//|
/* 使PWM发生器块计数器. */
PWMGenEnable(PWM0_BASE, PWM_GEN_0);
PWMGenEnable(PWM0_BASE, PWM_GEN_1);
PWMGenEnable(PWM0_BASE, PWM_GEN_2);
PWMGenEnable(PWM0_BASE, PWM_GEN_3);
}
注意,这个地方,我将PWM的占空比分为了100等分,后面需要修改占空比的话,只需要在100等分上分等分就可以实现PWM占空比的修改。
更改占空比的方式:
通过修改PWMPWMPulseWidthSet(),这个函数中的值,得到不同占空比的PWM。
修改函数
void contrl(uint32_t a,uint32_t b,uint32_t c,uint32_t d)
{
/* a b c d
前进 x 0 x 0
后退 0 x 0 x
左转 x 0 0 x
右转 0 x x 0
停止 0 0 0 0
刹车 1 1 1 1
*/
/* 设置PWM0 PF0的占空比为25%。你把占空比设为
期间的功能。由于上面设置了句点,您可以使用
PWMGenPeriodGet()函数。对于这个例子,PWM将是高的
25%的时间或16000个时钟周期(64000 / 4)。 30%的占空比高电平*/
PWMPulseWidthSet(PWM0_BASE, PWM_OUT_1, //第一路PWM PF1
a*MAP_PWMGenPeriodGet(PWM0_BASE, PWM_GEN_0) / 10);//10表示自己将占空比均分的等分,a表示自己需要多少占空比PWM,所要确定的值,下面同理。
PWMPulseWidthSet(PWM0_BASE, PWM_OUT_2, //第二路PWM PF2
b*MAP_PWMGenPeriodGet(PWM0_BASE, PWM_GEN_1) / 10);
PWMPulseWidthSet(PWM0_BASE, PWM_OUT_3, //第三路PWM PF3
c*MAP_PWMGenPeriodGet(PWM0_BASE, PWM_GEN_2) / 10);
PWMPulseWidthSet(PWM0_BASE, PWM_OUT_4, //第四路PWM PG0
d*MAP_PWMGenPeriodGet(PWM0_BASE, PWM_GEN_2) / 10);
PWMOutputState(PWM0_BASE, (PWM_OUT_1_BIT | PWM_OUT_3_BIT | PWM_OUT_2_BIT | PWM_OUT_4_BIT) , true);//| PWM_OUT_2_BIT
/*L298N驱动思路*/
/*GPIOPinWrite(GPIO_PORTK_BASE,GPIO_PIN_0,0);
GPIOPinWrite(GPIO_PORTK_BASE,GPIO_PIN_1,0xff);
GPIOPinWrite(GPIO_PORTK_BASE,GPIO_PIN_2,0);
GPIOPinWrite(GPIO_PORTK_BASE,GPIO_PIN_3,0xff);*/
}
二、驱动直流电机
电机驱动板
我采用的这个电机驱动模块,它是一种宽电压输入的模块,控制方法
电机 | 状态 | D0 | D1 | D2 | D3 |
电机1 | 正转 | 1/PWM | 0 | / | / |
反转 | 0 | 1/PWM | / | / | |
停止 | 0 | 0 | / | / | |
刹车 | 1 | 1 | / | / | |
电机2 | 正转 | / | / | 1/PWM | 0 |
反转 | / | / | 0 | 1/PWM | |
停止 | / | / | 0 | 0 | |
刹车 | / | / | 1 | 1 |
注意:1指代的是固定速度的,PWM指代的是可以输入可变占空比的PWM波,达到调速的目的。
接线说明:PF1->D0
PF2->D1
PF3->D2
PG0->D3
最后附上开源工程,喜欢的朋友帮忙点个赞哦!!!欢迎大家一起交流!
【免费】四路PWM控制电机,调节电机速度资源-CSDN文库https://download.csdn.net/download/qq_62291061/88180587