pwm中脉冲数如何统计

发表在 网络学习营2019-4-30 15:17 [复制链接] 8 312

以下是根据官方的例程写得一个简单的PWM的程序,控制步进电机,由于步进电机的正反转的位置有差异,所以除了通过延时控制波的时间,有什么方法可以获得PWM的脉冲数?8 v8 p) N% I& N6 p
2 o, ]3 D/ h8 M1 R" Y
struct rt_device_pwm *pwm_dev;      /* PWM设备句柄 */$ `" j  E7 [" \4 {
! i. G2 M, Q9 H* y; T; u
//一个脉冲的程序,输出频率为 2KHz,占空比为 pulse / period,pulse 值不能超过 period
) c8 c2 b! F0 s2 m- K2 U, {) Fstatic void motor_thread_entry(void *parameter)1 _9 [, e. j& r* k
{ ! [* f6 g& _7 e9 y
                rt_uint32_t period, pulse;
# ^7 c/ z4 {0 o7 n2 d* h' L5 c9 _, l# X% r( R; A- K5 a
                period = 250000;    /* 周期为0.25ms,单位为纳秒ns,频率太快每次控制会抖动 */
- u" n1 h! s% t, Y' x                pulse  = 125000;    /* PWM脉冲宽度值,单位为纳秒ns,此时占空比为 pulse / period = 0.5 */
1 X  }5 z4 M/ U% r3 d3 B6 l        ( w2 d& r/ b1 F& O# r2 M
                /* 设置PWM周期和脉冲宽度 */: }  a: @' u( T# f. S
                rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);! ~8 |" L9 Z8 J# O
                rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);               //使能设备                                                                               
) b8 i* c4 u1 i" }                rt_thread_mdelay(cylinder_number);                                     //800代表延时1圈对应的时间                                                               
7 @4 d' A6 Z& p  J8 l  W                 rt_pwm_disable(pwm_dev, PWM_DEV_CHANNEL);       & V5 f* J7 A% `+ S: \; |  K
0 [3 Z3 V7 t! Q) |( O
}
. h+ V3 @3 D# ?7 o: l$ {  ^  {" J& i$ e2 p9 m  l/ V
static rt_thread_t tid3 = RT_NULL;( r4 _& h2 b- R- I  Y- X

6 X0 `9 }! J+ F, Lint motor(void)
3 O$ a% i. ]7 N1 d5 M$ a3 Y{        ' Q. w2 T$ v0 ^+ k( J) H% Q
                /* 查找设备 */
4 ~! X! S$ Z4 S: @' s; B                pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);
! ]# r6 K& d) c( |. d0 [        ; q. G) C$ y: |2 t4 f
          if (pwm_dev == RT_NULL)$ h# {3 n5 k% a2 h, }, B
    {9 ~4 A% A* D) d+ ]4 ]
        rt_kprintf("pwm sample run failed! can't find %s device!\n", PWM_DEV_NAME);
! ^& `# O( m) _        return RT_ERROR;
# s7 k, |" I3 Y8 Z8 F    }               
5 Z0 I  U1 ]" C: h       
' |4 n# B  p8 G9 C" x                /********************************创建线程***************************************/) I0 n4 ~9 W# O
                /* 动态创建线程1,名称是thread1,入口是thread1_entry*/
; r7 R+ w- U6 ^1 `- _+ B3 o- l2 }    tid3 = rt_thread_create("pwm_dev",6 E" a0 X. y2 m# c
                            motor_thread_entry, RT_NULL,* ]+ y6 Z% a0 O) _& G1 Z2 @
                            THREAD_STACK_SIZE,
* l: e/ \8 g' O" B+ m  d                            THREAD_PRIORITY, THREAD_TIMESLICE);
: \8 b8 k1 ^' |6 a* v* W; e" e
/ T. S1 g, G; T4 `    /* 如果获得线程控制块,启动这个线程 */0 r3 j$ v0 |7 B# z# M! J7 V8 o
    if (tid3 != RT_NULL)
* P) |8 m; S. p& |: O3 p7 ~        rt_thread_startup(tid3);$ @3 O  Z# \6 ]0 W
                               
. `$ h" o. M- r% D% [          return 0;
- @6 y% Q0 ]2 e( |( q. d. s, i& D}  N/ t( l% R' z0 z8 G& n6 V
- P8 T$ J+ }" p# N8 t
7 N/ R% s. g) F( F" w
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-4-30 15:23:18 | 显示全部楼层
为什么没有相应的api
使用道具 举报 回复
发表于 2019-4-30 16:03:34 | 显示全部楼层
这个功能可以到 github 上去提功能 issue,这样能更快的推动来实现它。
使用道具 举报 回复
发表于 2019-5-2 10:35:31 | 显示全部楼层
yqiu 发表于 2019-4-30 16:03
2 r- M! T0 @/ W4 N2 Z. X这个功能可以到 github 上去提功能 issue,这样能更快的推动来实现它。
  Z* M- w  ~" u& y3 R( Q3 u# i
懂了,还没这个功能哈哈
使用道具 举报 回复
发表于 2019-5-21 13:08:10 | 显示全部楼层
请问脉冲数楼主怎么统计的?解决了嘛& }7 L/ u- F1 _9 f
使用道具 举报 回复
发表于 2019-5-24 16:21:07 | 显示全部楼层
cyz13 发表于 2019-5-21 13:08* z0 _) k( K: n# Q& R1 }: o; W: o
请问脉冲数楼主怎么统计的?解决了嘛

' S$ K$ C% h2 v8 N' B没有,尝试过外部接线,将脉冲输出通过接线与io相接,再通过io口输入中断来计数,对我要做的实验来说不是太准,你可以试一下,不过这个方式也不太好
使用道具 举报 回复
发表于 2019-5-25 10:31:59 | 显示全部楼层
pwm用输出比较模式就可以计数脉冲,但是不知rtt的框架支持不
使用道具 举报 回复
发表于 2019-5-27 08:16:31 | 显示全部楼层
STM32可以用主从模式stm32主从模式定时器产生精确脉冲个数,其他的可以把输出通过CPU引脚接到另一个定时器的输入来计数
使用道具 举报 回复
发表于 2019-6-21 09:49:53 | 显示全部楼层
类似的问题! |" L  f$ z3 A4 Y

3 w1 ~6 ], ?0 A- [! ?https://www.rt-thread.org/qa/thread-11830-1-1.html
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RT-Thread开发者社区  

© 2013-2017 上海睿赛德电子科技有限公司 沪ICP备13014002号-1

Powered by RT-Thread

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