使用msp432搭建的平衡小车(一)

发布时间:2022-12-21  

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);   

    }

  }  

}


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>