3596|10

2774

帖子

8

TA的资源

版主

楼主
 

KW41 自动搬运小车测试 [复制链接]

本帖最后由 strong161 于 2017-6-6 10:19 编辑

        点完灯后一直没有没更新,主要是技术不行,BLE一直整不懂,所以暂时先搞下基本车子的功能,先分享一下近期的进展吧。结构比较简单,就是个四驱小车,实际采用的是双驱,只用了一片L298N,结果,压跟带不起4个电机,……抽空再加一片L298N吧。半边跑一顿撞,红外寻迹Sensor只余下两路了,所以代码还是得改改,2路是个尴尬的问题变成妞妞车了。
      
       因为KW41兼容arduino接口,所以就直接把所有电路都直接怼在一个arduino扩展板上了,这样的好处就是,每次不用老是一根一根对线了。在这里对KW41还是要提点建议的,KW41的板子上面设计可不可以把带PWM IO也能arduino兼容一下,这样就更加直接观了,更加方便了,因为某宝上查了一些arduino直插的电机驱动板,那样会很方便,但是与KW41是没法怼的,因为使用是arduino带PWM输出的IO,而对应的IO在KW41上面并没有PWM功能,需要软件来做,这样就比较复杂了。
      另外还有一个比较尴尬的事,就是原来设计按SW3进入中断,然后使能启动主程序,结果一直进不了中断,后面检查发现,SW3的IO被占用了,也就是一个IO做了板载SW后,同时又做成了arduino接口,当然这个主要是自己没有仔细看,不过一个IO做了板载SW最好就不要再放到arduino接口上面了。
        
        
        


  1. gpio_pin_config_t moto_config = {
  2.                 kGPIO_DigitalOutput, 0,
  3. };
  4. /*moto IO init*/
  5. #define MOTO_INIT                                                    \
  6.          GPIO_PinInit(MOTO_LEFT1_GPIO, MOTO_LEFT1_GPIO_PIN, &moto_config);\
  7.          GPIO_PinInit(MOTO_LEFT2_GPIO, MOTO_LEFT2_GPIO_PIN, &moto_config);\
  8.          GPIO_PinInit(MOTO_RIGHT1_GPIO, MOTO_RIGHT1_GPIO_PIN, &moto_config);\
  9.          GPIO_PinInit(MOTO_RIGHT2_GPIO, MOTO_RIGHT2_GPIO_PIN, &moto_config)
  10. /*moto dirct*/
  11. #define MOTO_LEFT_RUN                                           \
  12.                 GPIO_WritePinOutput(MOTO_LEFT1_GPIO, MOTO_LEFT1_GPIO_PIN, 1);\
  13.                 GPIO_WritePinOutput(MOTO_LEFT2_GPIO, MOTO_LEFT2_GPIO_PIN, 0)
  14. #define MOTO_RIGHT_BACK                                          \
  15.                 GPIO_WritePinOutput(MOTO_LEFT1_GPIO, MOTO_LEFT1_GPIO_PIN, 0);\
  16.                 GPIO_WritePinOutput(MOTO_LEFT2_GPIO, MOTO_LEFT2_GPIO_PIN, 1)

  17. #define MOTO_RIGHT_RUN                                             \
  18.                 GPIO_WritePinOutput(MOTO_RIGHT1_GPIO, MOTO_RIGHT1_GPIO_PIN, 1);\
  19.                 GPIO_WritePinOutput(MOTO_RIGHT2_GPIO, MOTO_RIGHT2_GPIO_PIN, 0)
  20. #define MOTO_LEFT_BACK                                            \
  21.                 GPIO_WritePinOutput(MOTO_RIGHT1_GPIO, MOTO_RIGHT1_GPIO_PIN, 0);\
  22.                 GPIO_WritePinOutput(MOTO_RIGHT2_GPIO, MOTO_RIGHT2_GPIO_PIN, 1)
复制代码

  1. /*setting for four tracking Sensors */
  2. #define TRACK_SENSOR_GPIO GPIOB
  3. #define TRACK_SENSOR_PORT PORTB
  4. //#define TRACK_SENSOR1_GPIO_PIN  1U
  5. #define TRACK_SENSOR2_GPIO_PIN  1U
  6. #define TRACK_SENSOR3_GPIO_PIN  2U
  7. //#define TRACK_SENSOR4_GPIO_PIN  18U

  8. #define TRACK_SENSOR_IRQ PORTB_PORTC_IRQn
  9. #define TRACK_SENSOR_IRQ_HANDLER PORTB_PORTC_IRQHandler
复制代码

       以前没有好好玩过小车,所以对L298N使用有点尴尬,仿佛是有坑的,本来是打算通过Enable输入PWM进行调速的,结果根本调不了……后来经饺神指导,说L298N的enable使能调PWM基本上要最低频,那样PWM就没有什么意思了,所以还是用直接输出到IN上面控制电机。
   
  1. void TRACK_SENSOR_IRQ_HANDLER(void) {
  2. /*read IRQ source and clean IRQ */
  3. //        if (GPIO_GetPinsInterruptFlags(TRACK_SENSOR_GPIO)&(1U << TRACK_SENSOR1_GPIO_PIN)) {
  4. //                GPIO_ClearPinsInterruptFlags( TRACK_SENSOR_GPIO,1U << TRACK_SENSOR1_GPIO_PIN);
  5. //                AUTO_MODE = 1;
  6. //                        }
  7. //
  8. //        else
  9.         if (GPIO_GetPinsInterruptFlags(TRACK_SENSOR_GPIO)&(1U << TRACK_SENSOR2_GPIO_PIN)) {
  10.                 GPIO_ClearPinsInterruptFlags( TRACK_SENSOR_GPIO,1U << TRACK_SENSOR2_GPIO_PIN );
  11.                 AUTO_MODE = 2;
  12.                         }

  13.         else if (GPIO_GetPinsInterruptFlags(TRACK_SENSOR_GPIO)&(1U << TRACK_SENSOR3_GPIO_PIN)) {
  14.                 GPIO_ClearPinsInterruptFlags( TRACK_SENSOR_GPIO,1U << TRACK_SENSOR3_GPIO_PIN);
  15.                 AUTO_MODE = 3;
  16.                         }

  17.         else if(GPIO_GetPinsInterruptFlags(BOARD_SW_GPIO)&(1U<< BOARD_SW_GPIO_PIN)){
  18.             /* Clear external interrupt flag. */
  19.             GPIO_ClearPinsInterruptFlags(BOARD_SW_GPIO, 1U << BOARD_SW_GPIO_PIN);
  20.             /* Change state of button. */
  21.             SwForStart = 1;
  22.         }
  23.         else printf("error cannot find the IRQ");
  24. }
复制代码


主程序

  1. int main(void) {
  2.     /* Define the init structure for the input switch pin */
  3.     gpio_pin_config_t sw_config = {
  4.         kGPIO_DigitalInput, 0,
  5.     };
  6.     /* Init input switch GPIO. */
  7.         /*MOTO Enable TPM seting */

  8.           /*
  9.              * tpmInfo.prescale = kTPM_Prescale_Divide_1;
  10.              * tpmInfo.useGlobalTimeBase = false;
  11.              * tpmInfo.enableDoze = false;
  12.              * tpmInfo.enableDebugMode = false;
  13.              * tpmInfo.enableReloadOnTrigger = false;
  14.              * tpmInfo.enableStopOnOverflow = false;
  15.              * tpmInfo.enableStartOnTrigger = false;
  16.              * tpmInfo.enablePauseOnTrigger = false;
  17.              * tpmInfo.triggerSelect = kTPM_Trigger_Select_0;
  18.              * tpmInfo.triggerSource = kTPM_TriggerSource_External;
  19.              */
  20.     tpm_config_t tpmInfo;

  21.     tpm_chnl_pwm_signal_param_t tpmParam[2];
  22.     /* Configure tpm params with frequency 24kHZ */
  23.     tpmParam[0].chnlNumber = (tpm_chnl_t)MOTO_LEFT_TPM_CHANNEL;
  24.     tpmParam[0].level = kTPM_LowTrue;
  25.     tpmParam[0].dutyCyclePercent = updatedDutycycleLeft;

  26.     tpmParam[1].chnlNumber = (tpm_chnl_t)MOTO_RIGHT_TPM_CHANNEL;
  27.     tpmParam[1].level = kTPM_LowTrue;
  28.     tpmParam[1].dutyCyclePercent = updatedDutycycleRight;

  29.   /*config for Sensor IO*/
  30.     gpio_pin_config_t Track_Sensor_config = {
  31.         kGPIO_DigitalInput, 0,
  32.     };


  33.           /* Init board hardware. */
  34.     BOARD_InitBootPins();
  35.     BOARD_InitBootClocks();
  36.           /* Init FSL debug console. */
  37.     BOARD_InitDebugConsole();

  38.     /*Init the Moto IO*/
  39.     MOTO_INIT;

  40.     /*for Start SW */
  41.     PORT_SetPinInterruptConfig(BOARD_SW_PORT, BOARD_SW_GPIO_PIN, kPORT_InterruptFallingEdge);


  42.     /*Init the Tracking Sensor IO */
  43.     /*
  44.      * Sensor1 out of line and in line all in interrupt,
  45.      * then need to check the site of the pin,if in line Turn to high speed ,else in half speed
  46.      * Sensor2,3 only the Sensor in rising Well be interrupt
  47.      * */
  48.     //PORT_SetPinInterruptConfig(TRACK_SENSOR_PORT, TRACK_SENSOR1_GPIO_PIN, kPORT_InterruptEitherEdge);
  49.     PORT_SetPinInterruptConfig(TRACK_SENSOR_PORT, TRACK_SENSOR2_GPIO_PIN, kPORT_InterruptRisingEdge);
  50.     PORT_SetPinInterruptConfig(TRACK_SENSOR_PORT, TRACK_SENSOR3_GPIO_PIN, kPORT_InterruptRisingEdge);
  51.    /*Enable of IRQ of the Sensor and Init all Sensor pin*/
  52.     EnableIRQ(TRACK_SENSOR_IRQ);
  53.    // GPIO_PinInit(TRACK_SENSOR_GPIO, TRACK_SENSOR1_GPIO_PIN, &Track_Sensor_config);
  54.     GPIO_PinInit(TRACK_SENSOR_GPIO, TRACK_SENSOR2_GPIO_PIN, &Track_Sensor_config);
  55.     GPIO_PinInit(TRACK_SENSOR_GPIO, TRACK_SENSOR3_GPIO_PIN, &Track_Sensor_config);

  56.     /*for Start SW*/
  57.     GPIO_PinInit(BOARD_SW_GPIO, BOARD_SW_GPIO_PIN, &sw_config);

  58.     /* Select the clock source for the TPM counter as MCGPLLCLK */
  59.     CLOCK_SetTpmClock(1U);

  60.     TPM_GetDefaultConfig(&tpmInfo);

  61.     /* Initialize TPM module */
  62.     TPM_Init(MOTO_TPM_BASEADDR, &tpmInfo);
  63.     TPM_SetupPwm(MOTO_TPM_BASEADDR, tpmParam, 2U, kTPM_EdgeAlignedPwm, 20000U, TPM_SOURCE_CLOCK);


  64. //    car_move_control_t car_mover_config;
  65. //    car_mover_config.CarLeftMotoDirection = 1;
  66. //    car_mover_config.CarRightMotoDirection = 1;
  67. //    car_mover_config.CarLeftMotoEnable = 50;
  68. //    car_mover_config.CarRightMotoEnable = 20;

  69. /*wait for pass Sw4 for start  */

  70.     while( 0==SwForStart ){
  71.             printf("pass the key for start \n");
  72.             delay();
  73.             delay();
  74.             delay();
  75.     }
  76.     printf("init over \n");
  77.     /*moto direct */
  78.     MOTO_LEFT_RUN;
  79.     MOTO_RIGHT_RUN;
  80.     /*Start PWM*/
  81.     TPM_StartTimer(MOTO_TPM_BASEADDR, kTPM_SystemClock);

  82.     /* Enter an infinite loop for Run Auto */
  83.     /*just  for test pwm*/
  84. //    for(;;){
  85. //
  86. //        TPM_UpdatePwmDutycycle(        MOTO_TPM_BASEADDR,
  87. //                                                        (tpm_chnl_t)MOTO_LEFT_TPM_CHANNEL,
  88. //                                                            kTPM_EdgeAlignedPwm,
  89. //                                                            50);
  90. //
  91. //        TPM_UpdatePwmDutycycle(        MOTO_TPM_BASEADDR,
  92. //                                                        (tpm_chnl_t)MOTO_RIGHT_TPM_CHANNEL,
  93. //                                                            kTPM_EdgeAlignedPwm,
  94. //                                                            80);
  95. //
  96. //    }


  97.    for(;;){
  98.            if(0 == AUTO_MODE){
  99.                    CarRun(0);
  100.            }else if (1 == AUTO_MODE){
  101.                    CarRun(0);
  102.            }else if (2 == AUTO_MODE){
  103.                    CarTurnLeft(1);
  104.            }else if (3 == AUTO_MODE){
  105.                    CarTurnRight(1);
  106.            }

  107.     }
  108.     return 0 ;
  109. }
复制代码


自动运动与远程控制的函数
  1. void CarTurnRight(char turnRightSpeed){

  2.         uint8_t turnSpeed[2];

  3.         if(1 == turnRightSpeed)                {
  4.                 turnSpeed[0] = 80;
  5.                 turnSpeed[1] = 99;
  6.         }else if  (2 == turnRightSpeed)        {
  7.                 turnSpeed[0] = 90;
  8.                 turnSpeed[1] = 99;
  9.         }else                            {
  10.                 turnSpeed[0] = 95;
  11.                 turnSpeed[1] = 99;
  12.         }

  13.     TPM_UpdatePwmDutycycle(        MOTO_TPM_BASEADDR,
  14.                                                     (tpm_chnl_t)MOTO_LEFT_TPM_CHANNEL,
  15.                                                         kTPM_EdgeAlignedPwm,
  16.                                                         turnSpeed[0]);

  17.     TPM_UpdatePwmDutycycle(        MOTO_TPM_BASEADDR,
  18.                                                     (tpm_chnl_t)MOTO_RIGHT_TPM_CHANNEL,
  19.                                                         kTPM_EdgeAlignedPwm,
  20.                                                         turnSpeed[1]);
  21. }
  22. /**car TURN LEFT
  23. * turnLeftSpeed  1 high turn left
  24. * turnLeftSpeed  2 50% turn left
  25. * turnLefttSpeed  3 25% turn left
  26. *  */
  27. void CarTurnLeft(char turnLeftSpeed){
  28.          uint8_t turnSpeed[2];
  29.         if (1 == turnLeftSpeed)             {
  30.                 turnSpeed[0] = 80;
  31.                 turnSpeed[1] = 99;
  32.         }else if  (2 == turnLeftSpeed)        {
  33.                 turnSpeed[0] = 90;
  34.                 turnSpeed[1] = 99;
  35.         }else                           {
  36.                 turnSpeed[0] = 95;
  37.                 turnSpeed[1] = 99;
  38.         }

  39.         MOTO_LEFT_RUN;
  40.         MOTO_RIGHT_RUN;

  41.         TPM_UpdatePwmDutycycle(        MOTO_TPM_BASEADDR,
  42.                                                         (tpm_chnl_t)MOTO_LEFT_TPM_CHANNEL,
  43.                                                         kTPM_EdgeAlignedPwm,
  44.                                                         turnSpeed[1]);
  45.         TPM_UpdatePwmDutycycle(        MOTO_TPM_BASEADDR,
  46.                                                         (tpm_chnl_t)MOTO_RIGHT_TPM_CHANNEL,
  47.                                                         kTPM_EdgeAlignedPwm,
  48.                                                         turnSpeed[0]);

  49. }

  50. /**
  51. * Run mode
  52. * speed
  53. * depend on the
  54. * speed  = 1
  55. * 1 = hight speed
  56. * 0 = Low speed
  57. * */

  58. void CarRun(bool Speed){
  59.          uint8_t RunSpeed;
  60.          if(1 == Speed){
  61.                  RunSpeed = 95;
  62.          }else{
  63.                  RunSpeed = 99;
  64.          }
  65.          MOTO_LEFT_RUN;
  66.          MOTO_RIGHT_RUN;
  67.          /*Run with the speed */
  68.            TPM_UpdatePwmDutycycle(        MOTO_TPM_BASEADDR,
  69.                                                                        (tpm_chnl_t)MOTO_LEFT_TPM_CHANNEL,
  70.                                                            kTPM_EdgeAlignedPwm,
  71.                                                            RunSpeed);
  72.            TPM_UpdatePwmDutycycle(        MOTO_TPM_BASEADDR,
  73.                                                                        (tpm_chnl_t)MOTO_RIGHT_TPM_CHANNEL,
  74.                                                            kTPM_EdgeAlignedPwm,
  75.                                                            RunSpeed);
  76. }
  77. typedef struct _car_move_control
  78. {
  79.   bool CarLeftMotoDirection;          /* left moto direction */
  80.   bool CarRightMotoDirection;         /* Output direction */
  81.   char CarLeftMotoEnable;             /* present of Left moto PWM */
  82.   char CarRightMotoEnable;             /* present of Right moto PWM */
  83. } car_move_control_t;


  84. void CarMoveControl(car_move_control_t *Car_Move_control){
  85.         assert(Car_Move_control);
  86.         //uint16_t _temp = car_move_control_t *Car_Move_control

  87.         if(Car_Move_control->CarLeftMotoDirection) {
  88.                 MOTO_LEFT_RUN;
  89.         }else {
  90.                 MOTO_LEFT_BACK;
  91.         }

  92.         if(Car_Move_control->CarRightMotoDirection){
  93.                 MOTO_RIGHT_RUN;
  94.         }else {
  95.                 MOTO_RIGHT_BACK;
  96.         }
  97.         TPM_UpdatePwmDutycycle(        MOTO_TPM_BASEADDR,
  98.                                                         (tpm_chnl_t)MOTO_LEFT_TPM_CHANNEL,
  99.                                                         kTPM_EdgeAlignedPwm,
  100.                                                         Car_Move_control->CarLeftMotoEnable);
  101.         TPM_UpdatePwmDutycycle(        MOTO_TPM_BASEADDR,
  102.                                                         (tpm_chnl_t)MOTO_RIGHT_TPM_CHANNEL,
  103.                                                         kTPM_EdgeAlignedPwm,
  104.                                                         Car_Move_control->CarRightMotoEnable);
  105. }
复制代码


      整机状态如下图。
      
      周未由于撞坏了2个Sensor所以也改成2Sensor测试了,通过Sensor进中断,后分别调整两侧电机PWM,测试结果还是良好的。
来个视频吧。EE的视频咋加的,还不会,过一会儿再来补






此内容由EEWORLD论坛网友strong161原创,如需转载或用于商业用途需征得作者同意并注明出处




此帖出自NXP MCU论坛

最新回复

年轻人,谦虚点......  详情 回复 发表于 2017-6-6 15:17
点赞 关注
 

回复
举报

3415

帖子

0

TA的资源

纯净的硅(高级)

沙发
 
我在长沙发现了楼主
此帖出自NXP MCU论坛

点评

我都几个月没有去长沙了……  详情 回复 发表于 2017-6-6 10:35
 
个人签名

So TM what......?

 

 

回复

1059

帖子

1

TA的资源

版主

板凳
 
很好,多谢分享
此帖出自NXP MCU论坛

点评

谢谢腾哥帮顶  详情 回复 发表于 2017-6-6 10:36
 
 
 

回复

613

帖子

2

TA的资源

纯净的硅(初级)

4
 
代码狂人,贴了一堆
此帖出自NXP MCU论坛

点评

好像是写的太多了,看样子还是得删掉点!  详情 回复 发表于 2017-6-6 10:36
 
个人签名我是一头搞电子的猪,猪是一种好色的动物,猪八戒就是代表.       
 
 

回复

2774

帖子

8

TA的资源

版主

5
 
ljj3166 发表于 2017-6-6 10:21
我在长沙发现了楼主

  我都几个月没有去长沙了……
此帖出自NXP MCU论坛

点评

年轻人,谦虚点......  详情 回复 发表于 2017-6-6 15:17
 
 
 

回复

2774

帖子

8

TA的资源

版主

6
 
qwerghf 发表于 2017-6-6 10:26
很好,多谢分享

谢谢腾哥帮顶
此帖出自NXP MCU论坛
 
 
 

回复

2774

帖子

8

TA的资源

版主

7
 
long521 发表于 2017-6-6 10:31
代码狂人,贴了一堆

好像是写的太多了,看样子还是得删掉点!
此帖出自NXP MCU论坛
 
 
 

回复

1403

帖子

1

TA的资源

纯净的硅(中级)

8
 
6b了铁
此帖出自NXP MCU论坛
 
个人签名HELLO_WATER
 
 

回复

1237

帖子

65

TA的资源

纯净的硅(中级)

9
 
只用了一块啊
此帖出自NXP MCU论坛

点评

车上空间不多!……  详情 回复 发表于 2017-6-6 14:05
 
 
 

回复

2774

帖子

8

TA的资源

版主

10
 

车上空间不多!……
此帖出自NXP MCU论坛
 
 
 

回复

3415

帖子

0

TA的资源

纯净的硅(高级)

11
 
strong161 发表于 2017-6-6 10:35
我都几个月没有去长沙了……

年轻人,谦虚点......
此帖出自NXP MCU论坛
 
个人签名

So TM what......?

 

 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表