MSP432E401Y——4路PWM波输出驱动小车

最近拿到了一块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

 或者在我上传的资源里面也有:

(16条消息) MDK编译MSP432E401Y的芯片包资源-CSDN文库https://download.csdn.net/download/qq_62291061/88015070?spm=1001.2014.3001.5503

安装好之后会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);*/
}

二、驱动直流电机

电机驱动板

 我采用的这个电机驱动模块,它是一种宽电压输入的模块,控制方法

电机状态D0D1D2D3
电机1正转1/PWM0//
反转01/PWM//
停止00//
刹车11//
电机2正转//1/PWM0
反转//01/PWM
停止//00
刹车//11

注意:1指代的是固定速度的,PWM指代的是可以输入可变占空比的PWM波,达到调速的目的。

接线说明:PF1->D0

                  PF2->D1

                  PF3->D2

                  PG0->D3

最后附上开源工程,喜欢的朋友帮忙点个赞哦!!!欢迎大家一起交流!

【免费】四路PWM控制电机,调节电机速度资源-CSDN文库icon-default.png?t=N6B9https://download.csdn.net/download/qq_62291061/88180587

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小张_Serendipity !

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值