注册 登录
查看: 141|回复: 6

[K60] 关于虚拟示波器测电机速度问题

[复制链接]
发表于 2016-12-26 12:10:12 | 显示全部楼层 |阅读模式
用山外哥给的FTM_正交解码例程测速,通过vcan_sendware(void *wareaddr, uint32_t waresize)显示在虚拟示波器上,为什么波形抖动成这样?用printf显示在串口调试没问题。
  1. #include "common.h"
  2. #include "include.h"

  3. #define MOTOR_FTM   FTM0
  4. #define Forward_PWM  FTM_CH3
  5. #define Backward_PWM  FTM_CH4

  6. #define MOTOR_HZ    500//Hz
  7. #define MOTOR_DUTY  80


  8. void PIT0_IRQHandler(void);

  9. void main()
  10. {

  11.     ftm_pwm_init(MOTOR_FTM, Forward_PWM,MOTOR_HZ,20);      //初始化 电机 PWM
  12.     ftm_pwm_init(MOTOR_FTM, Backward_PWM,MOTOR_HZ,0);      //初始化 电机 PWM
  13.    
  14.     ftm_quad_init(FTM2);                  //FTM2 正交解码初始化(所用的管脚可查 port_cfg.h )
  15.   pit_init_ms(PIT0, 5);                 //初始化PIT0,定时时间为: 10ms
  16.   set_vector_handler(PIT0_VECTORn ,PIT0_IRQHandler);    //设置PIT0的中断服务函数为 PIT0_IRQHandler
  17.   enable_irq (PIT0_IRQn);                 //使能PIT0中断

  18.     while(1)
  19.     {

  20.     }

  21. }

  22.   /*!
  23.    *  @brief    PIT0中断服务函数
  24.    *  @since    v5.0
  25.    */
  26. void PIT0_IRQHandler(void)
  27. {

  28.     int16 val;
  29.     uint16 speed;
  30.     val = ftm_quad_get(FTM2);       //获取FTM 正交解码 的脉冲数(负数表示反方向)
  31.     ftm_quad_clean(FTM2);
  32.    
  33.    
  34.     if(val>=0)
  35.     {
  36.         speed = val;
  37.         //printf("\n正转:%d",speed);
  38.     }
  39.     else
  40.     {
  41.         speed = -val;
  42.         //printf("\n反转:%d",speed);
  43.     }
  44.     vcan_sendware((uint8_t *)speed, sizeof(speed));


  45.     PIT_Flag_Clear(PIT0);    //清中断标志位
  46. }




另外如果直接用vcan_sendware函数输出 int16 val 会出现HardFault Interrupt
****default_isr entered on vector 3*****




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2016-12-26 12:45:39 | 显示全部楼层
数据类型有误,自己认真思考一下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-26 15:43:41 | 显示全部楼层
山外メ雲ジ 发表于 2016-12-26 12:45
数据类型有误,自己认真思考一下

无符号类型要做强制类型转换吗?speed = (uint16)val;
但是还是有问题啊,依然数据是抖动的,但是用串口调试直接看数据没问题。

求山外哥告诉解决办法,万分感谢~
回复 支持 反对

使用道具 举报

发表于 2016-12-26 16:40:48 | 显示全部楼层
vcan_sendware((uint8_t *)speed, sizeof(speed));

这句话有误
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-26 17:00:19 | 显示全部楼层
别寻芳 发表于 2016-12-26 16:40
vcan_sendware((uint8_t *)speed, sizeof(speed));

这句话有误

http://www.vcan123.com/forum.php ... id=6253&ctid=27
【uint16案例】
假如是16位呢?修改方法如下:
uint8 var[5];   ===>   uint16 var[5];

发送函数不需要修改,原先那样调用就好了:
vcan_sendware((uint8_t *)var, sizeof(var));


这边不是说不需要修改?
回复 支持 反对

使用道具 举报

发表于 2016-12-26 17:17:22 | 显示全部楼层
core571 发表于 2016-12-26 17:00
http://www.vcan123.com/forum.php?mod=viewthread&tid=6253&ctid=27
【uint16案例】
假如 ...

不同的,山外帖子定义的是数组,你定义的是变量,所以你的要改一下:


vcan_sendware((uint8_t *)&speed, sizeof(speed));
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-26 19:00:41 | 显示全部楼层
0242243806 发表于 2016-12-26 17:17
不同的,山外帖子定义的是数组,你定义的是变量,所以你的要改一下:

懂了,万分感谢
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回列表 返回顶部