你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

利用STM32F407发送精确个数脉冲,控制伺服电机。  

[复制链接]
wjandsq 发布时间:2015-3-2 11:58
本帖最后由 wjandsq 于 2018-1-10 19:44 编辑 7 ?3 z0 _3 o# U4 D) r2 h
4 w! l( B3 W; O
使用STM32F407的TIM3、TIM4精确发送固定个数脉冲,PC6、PB6两路500KHz PWM,用于控制两路伺服电机。0 J2 q7 X6 I' s/ n8 E
6 W+ ^- B" k3 ]( L
一、本例程的主要功能:
) X0 r6 N" D# s3 N2 m9 s4 U6 s0 ~/ i9 R/ `7 s9 H2 y* v8 @" w
1.USB-CDC 功能(使用USART1-PA9 USART1-PA10)。
, K0 d. q* ?+ \: u& f: u: F   PC机通过USB通讯发送控制命令到STM32,命令还可以通过USART1-PA9转发出去。5 i! b& i# y' y, b! C2 F0 G# i
/ l; n4 D7 ^4 f$ @: P
2.使用TIM3 CH1通道发送精确个数脉冲(使用PC6)。( h) W+ O' D, K) `) n& `6 _  L, x  Z
" |$ v* h0 A  s
  发送精确个数脉冲,需要启用TIM3 的DMA通讯,在每个脉冲周期结束时,: m# h) x5 h* G& z! r$ L
  DMA自动将内存中的占空比数据传输至CCR1,DMA传输的次数到达设定值N,
  o$ B2 g: i" M8 ?1 k  则进入DMA传输完毕中断,此时已发送N-1个脉冲,因此在该中断中,
" r$ F4 E" t6 t2 k/ Z( M  设置TIM3 为单脉冲模式,脉冲发送自动停止。5 j9 V5 H: J1 V  {) a3 K7 S

& k1 o6 ]7 }& o9 ]: K  总脉冲个数  =  DMA传输次数(N) * DMA通讯中断次数(M)
# M9 {' W8 q; Q
$ ^: z+ o" T8 R4 ]/ v1 R, l( U  目前发现的bug描述:
' ?. e" b4 B. Q/ [& r8 X  (1) 首次启动时,如果发送多个脉冲,则会出现多发1个脉冲的情况。& R. x; i, C; Q1 U
  (2) 首次启动时,如果发送单个脉冲,再发送多个脉冲,不会出现该bug。; j! Z7 M; I" E4 v1 ~

/ H: K. a( A4 L( q$ b# M* m  临时解决方案:. O' V* L' y$ T% H8 m' P( v: m
  启动时将一个特殊标志初始化为1。
# C0 {5 _, M& N" T4 F& b  如果启动后就发送多个脉冲,则将脉冲数量减去1,然后将特殊标志清0。6 H8 h. o. _6 s
  如果启动后发送单个脉冲,不会出现bug,所以要将那个特殊标志清0。
0 y4 l6 D' }, O! d3 Q( F6 ]6 t7 M5 o1 H& `. ~* e" K4 R; K7 v/ `+ a
3.使用TIM4 CH1通道发送精确个数脉冲(使用PB6)。7 V* e) t9 i6 _, |' G* I8 x
  同上。
* C  v9 O+ N* A6 t+ |+ G( ?6 Z4 [7 B
4.在RAM进行硬件仿真调试的说明" K0 o! @7 K) @: t6 |0 z0 V2 \
  本例程成功地验证了STM32F407可以在内部RAM中进行硬件仿真调试。  k0 i. v7 L0 J4 D/ }/ J- T
  注意DMA等的初始化,内存到外设的传输宽度为16位,只有设置正确,
- ^2 ~# x6 ]6 S) K, s  才能进入DMA传输完毕中断。$ E- n2 X$ V$ Z9 D5 x( @

+ b/ s& S/ @9 p; Y! A: u三、本例程软件改动如下:
7 R- @( i. v, ]
9 k! _0 Y+ z& I5 E1.在usb_conf.h的第179行,注释掉了 VBUS_SENSING_ENABLED 宏定义。
! K' B% E, q4 Q9 L2.stm324xg_eval.h中增加USART1相关的宏定义:0 V$ {  ~6 }# Q1 A+ I

( O9 m# r9 A* K, l2 w' w1 s#ifdef VBUS_SENSING_ENABLED
6 R5 J1 a4 {; o3 h. b8 T3 J  #define EVAL_COM1                        USART3
4 W( ?3 z7 z& h: G4 r% @  #define EVAL_COM1_CLK                    RCC_APB1Periph_USART3) r  v/ W& I( M7 r
  #define EVAL_COM1_TX_PIN                 GPIO_Pin_10  t/ D0 g/ L1 l4 W; A
  #define EVAL_COM1_TX_GPIO_PORT           GPIOC1 p  ]5 W5 z9 J7 O! J7 E
  #define EVAL_COM1_TX_GPIO_CLK            RCC_AHB1Periph_GPIOC
2 w1 g! M9 l: E" \* z+ h  #define EVAL_COM1_TX_SOURCE              GPIO_PinSource10
0 `! W; l4 K9 Y0 B( Z8 K: O, O  #define EVAL_COM1_TX_AF                  GPIO_AF_USART3' G' _" V0 e, g4 ?5 x
  #define EVAL_COM1_RX_PIN                 GPIO_Pin_11
8 O9 ]1 c( i# E  #define EVAL_COM1_RX_GPIO_PORT           GPIOC
4 O+ ^9 R. @8 K3 J2 Y- I( a  #define EVAL_COM1_RX_GPIO_CLK            RCC_AHB1Periph_GPIOC: I5 `+ |- b" e1 T
  #define EVAL_COM1_RX_SOURCE              GPIO_PinSource11' F6 ^- \# G- m" T, ?1 r
  #define EVAL_COM1_RX_AF                  GPIO_AF_USART3
1 H' Z% M  ?/ h0 k$ B& R: b  #define EVAL_COM1_IRQn                   USART3_IRQn4 E$ j# r  [& R# g- H4 G1 p" M
#else
+ k: _) l2 o; O# J  #define EVAL_COM1                        USART1  i+ y6 {( V0 U, _+ {1 F& r
  #define EVAL_COM1_CLK                    RCC_APB2Periph_USART1$ V1 K/ U6 o( Z9 n) j
  #define EVAL_COM1_TX_PIN                 GPIO_Pin_9
; d& n+ @+ H0 v) F6 R+ i+ h  #define EVAL_COM1_TX_GPIO_PORT           GPIOA
" A9 _2 o$ s* Y( K" A  #define EVAL_COM1_TX_GPIO_CLK            RCC_AHB1Periph_GPIOA
) g7 C# ]6 [( C3 o6 f$ P  #define EVAL_COM1_TX_SOURCE              GPIO_PinSource9
2 ?- b# J* [; J  ?; x  #define EVAL_COM1_TX_AF                  GPIO_AF_USART1. R" A7 `  m; V. o' [7 j2 z
  #define EVAL_COM1_RX_PIN                 GPIO_Pin_10) d6 |# G; n, u6 J" a
  #define EVAL_COM1_RX_GPIO_PORT           GPIOA
" q1 `! \) l( ~6 h+ p  #define EVAL_COM1_RX_GPIO_CLK            RCC_AHB1Periph_GPIOA; }% h+ V. V9 n. V9 c3 U
  #define EVAL_COM1_RX_SOURCE              GPIO_PinSource10# ^) s: `4 |/ K8 p8 g8 B9 u0 t, T
  #define EVAL_COM1_RX_AF                  GPIO_AF_USART12 Y* Q; [( k' y6 P# Z
  #define EVAL_COM1_IRQn                   USART1_IRQn
7 o/ n' H3 F7 ]6 M#endif
; ^9 H, b: N4 n0 g- Q
. U) F4 z. R& V) v3. usbd_cdc_vcp.h中,增加USART1相关的宏定义6 |; I$ |: k) x8 \% D' w7 j7 X
#ifdef USE_STM3210C_EVAL% t7 L- L% D6 h3 J+ ], I* |7 h% u
  #define EVAL_COM_IRQHandler            USART2_IRQHandler
/ T5 }7 t8 @- \- N/ U8 W7 t* n#else5 e) M, u1 Q/ e1 z# |/ w
  #ifdef VBUS_SENSING_ENABLED% x, Z, ]; ^6 h
   #define EVAL_COM_IRQHandler            USART3_IRQHandler2 W5 ]6 z3 O+ A% D
  #else
4 {+ |9 z- _6 Z/ s   #define EVAL_COM_IRQHandler            USART1_IRQHandler
5 L- O" g  p: X5 p8 }& j  #endif" l) O) C, c* R9 V$ j9 S- A% O
#endif /* USE_STM322xG_EVAL */* ]9 {, Q4 m1 W& v$ l( B
; g+ w" N. {* L% `% ^

, b/ u8 w/ Q" w  T) B* R& S% ]4.USB内部或外部上拉电阻关闭与延迟打开的函数修改: {4 |3 r3 a2 e. d5 u# M
; z' Y+ K% {$ x8 I( N4 q" f7 g1 p9 F
void usb_start_delay(void)! C& z- G0 H' B3 r" L
{& K) l* j1 ?- P4 x% s+ y5 k
    uint16_t i,j;
# a9 J1 m$ d$ T% f; \+ o  @, m#ifdef VBUS_SENSING_ENABLED
- v/ g: L0 r+ N3 m- t2 a2 r    GPIOD->BSRRL = GPIO_Pin_6; /* 不启用外部USB上拉电阻 */
1 `# Z0 H7 S* M0 Y$ Y; R    for(i = 0; i < 10000; ++i){5 c0 z! L# v4 l0 s! j4 k0 L1 Y
        for(j = 0; j < 6000; ++j){4 c, O# G# A: b; T* v8 ~
1 S0 U5 Q4 g" _9 i
        }
: c4 h5 P% F* ~2 g8 x    }" H! N1 C8 H, }/ b5 ^
    GPIOD->BSRRH = GPIO_Pin_6; /* 启用外部USB上拉电阻 */8 m, J; X, u' {1 P& z: p
#else' g" p# x$ J5 ?" b+ V1 o6 q" ]
    GPIOD->BSRRL = GPIO_Pin_6; /* 不启用外部USB上拉电阻 */
1 n; Z( a4 Z7 `) b" c    DCD_DevDisconnect(&USB_OTG_dev); /* 不启用内部上拉电阻 */
; F9 X% m/ X' C3 [; K    for(i = 0; i < 10000; ++i){
5 X) G" P: n0 k( s        for(j = 0; j < 6000; ++j){
% t  `" g$ t2 h. p# l3 [+ s9 \5 M2 h
        }
" s, ^! l6 q; c8 ^' @    }
; N# ^* c; w6 C8 n    DCD_DevConnect(&USB_OTG_dev); /* 启用内部上拉电阻 */  Q! Y9 v& v% }# I7 `% ~  ^! j" K
#endif9 Z% G& `0 a, @9 m. l, Y
. z* S; ]) z9 w; B
}0 S- t1 c- m- z3 j

% a! \6 [3 h% d* a2 `- H! _  R5.USB虚拟串口的DTR RTS Break控制修改   可用DTR信号控制1路伺服电机正转还是反转。
/ m/ Y( x: r1 e   RTS信号无效,这是由于Windows USB驱动的问题造成的,ST依靠微软的USB驱动,  所以一直没有解决这个问题。" k  F  k. `8 O2 G' ]/ P0 Q" W
6.精确个数脉冲发送
: n0 g5 {; {! z* U( Y0 x在TIM3-CH1上(PC6)实现精确个数脉冲发送,用于控制第一路伺服电机
) z$ J/ Q: w; s1 o( T6 V在TIM4-CH1上(PB6)实现精确个数脉冲发送,用于控制第二路伺服电机5 ?, ~# F0 l1 L

- \" o3 w* E) \; w$ K1 D% ?
2 N6 ]: B6 G, M0 t四、工程包下载
1 r; H; m; d7 T+ f+ R+ I0 z# e7 v% ^" H, N
! ~" @8 I& j4 M9 m

9 v% j7 G+ c% ?, B8 q( r五、解压工具! p1 R7 W; }3 z
  下载最新的7z工具,7z938.exe,X86或X64均可。0 X/ H5 c# @5 ~+ J, E  a5 V/ W
. ^3 a+ Y3 R  A* x1 [: [
六、调试说明" \' \. U2 \+ k8 B7 ?1 P
1.点击载入配置按钮,选择测试的配置文件, 多字符串发送功能区的字符串列表自动更新。
+ s2 q* H0 Q3 O; W: k2 ^" C! V2 d$ [: C; R8 g/ x8 y6 S% g
2.选择STM32的虚拟串口号,由于是USB通信, 可以不用理会波特率等参数,那是串口对外发送的" ]) U0 u8 R0 m0 b
  波特率,这里通过USB传给STM32,通过串口向外发送的代码可以关掉,也可以保留。6 ~* R, _8 p& T. x$ `

  K; s, J& Q6 R" V! `+ P( @/ [3.点击启动发送,自动循环发送1-10个脉冲, 示波器测量PC6(第一路),可以看到脉冲数量的变化。
" C$ U$ n- o9 r6 k& p4 P& P
* _5 F2 f3 g6 _+ ^
. |; V3 F. F3 j$ e  p
& W- e+ y9 D+ `7 e9 I+ Z  P1 I3 X6 G: I
- U  v5 D& b* @) I3 @% i7 i- S
; l. g* g, `/ l( T1 B" y5 c8 H

6 p" L- A- Y# ~  K. r7 [8 b$ ]
( S% g$ r9 g% v6 S) b- L1 Z& @

USB串口工具发送命令

USB串口工具发送命令
赞 收藏 6 评论23 发布时间:2015-3-2 11:58

举报

23个回答
党国特派员 回答时间:2015-3-3 09:13:43
学习一下。   blank.png blank.png blank.png blank.png blank.png blank.png blank.png blank.png blank.png blank.png
kqh1120 回答时间:2015-3-2 15:56:14
学习了啊。还没用过伺服电机 1.png
yyh784 回答时间:2019-11-23 21:08:14
andrewytf 发表于 2018-3-2 17:15
4 N( n: ]7 O) w求工程包

, X( y( s$ [$ X6 X, S请不要随意伸手……
feel-376797 回答时间:2015-3-2 20:35:27
谢谢分享
bit 回答时间:2015-3-3 09:42:05
挺好的。用的什么伺服电机呢?
jor 回答时间:2017-7-31 08:37:26
楼主能发我工程包吗1023010634@qq.com
ty1148456099 回答时间:2017-8-27 16:01:45
求工程包 572083539@qq.com
boming 回答时间:2017-9-10 07:47:06
求工程包fengzhenbang@126.com
努力的人 回答时间:2017-9-10 11:25:26
建议楼主把资源直接发在帖子上,这样方便大家
andrewytf 回答时间:2018-3-2 17:15:40
求工程包 andrewytf@163.com
幻化仓龙 回答时间:2018-3-22 18:19:16
求工程包 37823542@QQ.com
zhenglu891028 回答时间:2018-4-19 21:13:57
求工程包 172814857@qq.com
soledad928 回答时间:2018-5-23 14:41:00
楼主,能把工程包分享一下吗 499296817@qq.com
飞翔-396652 回答时间:2019-3-27 14:12:11
谢谢分享 有空研究下
拖拉机先生 回答时间:2019-4-10 10:11:38
工程包下载怎么没有了
12下一页

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版