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

[自设STM32F103VET6测试LCD]6、PWM测试

[复制链接]
zhjb1 发布时间:2019-1-2 10:19
本帖最后由 zhjb1 于 2019-1-2 10:21 编辑   M  q) ]/ b. {
. W) d3 `2 ?( b9 j+ w' H
为了测试多路Timer本例选择了独立带有PWM输出的TIM1,3。只好用这2个TIMn来测试PWM。+ I1 r" Z* {. p3 G, |
由于是独立的2个时钟,所以周期等都不同,分别依次为2KHz,5KHz。由于我的主频为内置8MHz,时钟树最高只能设到64MHz,按照这个来设置其它的。导出工程文件。) @3 I, G8 ?1 Y; h1 t  B
当STM32CumeMX选设好后,可以在对应的tim.c中重新设置各项参数,还是很方便的。具体在STM32CubeMX中的TIM1的配置中截了3张图,分别是PING,Parment Settings和GPIO Settings,见图23_3_1~3。PWM2的Time3的设置与之相同之事频率为5K,设置值为199。! t" _7 O( w# ^3 A, |% s7 m& ^/ ~; T
在在自定义变量中添加变量:
% R$ {" j/ X3 t# B- A. A* i4 `int16_t pwm1=499,pwm3=199。
% M* Y+ `/ R8 W4 R6 Gmain前添加LED测试程序,原来的减少到1个:$ J$ U6 @& q# M) _2 B8 D
//TEST LEDs7 G! }: ?: r9 O" ~# N5 H
void ledTest(void){1 w. U/ t& y0 Q( ~3 D, A4 Y
  if(HAL_GPIO_ReadPin(GPIOC,LED1_Pin)){
. ^5 e/ U+ O3 |7 I  v7 N( @4 q" k; ^8 u0 p    HAL_GPIO_WritePin(GPIOC,LED1_Pin,GPIO_PIN_RESET);
, o3 e+ A9 J9 ]% |  }else{
2 l/ L3 M/ M' a* n' O! t( ]    HAL_GPIO_WritePin(GPIOC,LED1_Pin,GPIO_PIN_SET);
3 ~1 b! a5 x2 g9 [  }! \% c: b2 ^7 ]0 {6 t) J2 }- W0 m7 C
. B8 V( M/ E2 L, z
在main的里面前边添加函数:" h  `% @8 Y7 R; S- P6 D3 |% c# M0 j
MX_TIM1_Init();( a* X3 B* k# X! \! [) n
MX_TIM3_Init();: H; d' |2 m& v( P
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_4);//PA_11_2KHz3 y1 s% \1 W$ h9 ~
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);//PB_5__5KHz
2 y: S' ?" |; c3 O2 a在循环体中添加:# G% t! j; V" j$ Z. y% G- S" n$ K
   ledTest();1 _$ T7 R; f! Y/ L
   HAL_Delay(10);
$ ~* a- U: s2 A# Q( ?   adc_getvalue();
) A+ s4 A4 C7 P: K   if(pwm1<490)pwm1+=4;else pwm1=10; TIM1->CCR4=pwm1;//PA_11_2KHz
8 s& Z, l- P# U& h  g   if(pwm3<195)pwm3+=2;else pwm3=5;  TIM3->CCR2=pwm3;//PB_5__5KHz
8 c) N3 x* ~, T, g" `9 X# ^" C- u编译下载,结果见组合照片23_3_4,波形见照片23_3_5和23_3_6。特别打开tim.c,可以看到TIM1的函数:
: I$ |: Z6 P  _8 C$ Rvoid MX_TIM1_Init(void){) p7 W) O4 w, H% L
  TIM_MasterConfigTypeDef sMasterConfig;) o1 M' Q) a7 Q& ~- r: s6 o' M
  TIM_OC_InitTypeDef sConfigOC;1 r; ^# e4 q' O3 X
  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;
* `9 o) u: t$ D  N: e+ k  htim1.Instance = TIM1;
# b6 r' M; O' Q" Z) }6 `: P% }  htim1.Init.Prescaler = 63;6 i: O6 E' ], H' E0 s+ X0 X4 b
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  P& H- }: k7 T. j- r  htim1.Init.Period = 499;0 h9 M' O3 q( [+ y$ H
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;# j, E. E; Q5 P: R3 ^; O9 G
  htim1.Init.RepetitionCounter = 8;
  r9 |; g2 G0 ?* s% |: M$ O  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;4 j9 s$ r' Z) k
  if (HAL_TIM_PWM_Init(&htim1) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}( U) _+ B4 T: F0 |
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
' D( y8 l/ \# f( f) D  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;; V4 x( K1 H2 j4 }6 u
  if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}
* ^. M1 N* u" `8 o  sConfigOC.OCMode = TIM_OCMODE_PWM1;
" `0 X' {8 b; A9 C( Y  sConfigOC.Pulse = 50;' B# D3 h1 j) v) l; f3 U! _9 ]
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;9 r/ H$ e1 T' c6 w7 n; U
  sConfigOC.OCFastMode = TIM_OCFAST_ENABLE;7 [5 ]9 x& w# O! T
  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;$ r8 C  W) ^# A5 M) c- b
  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;7 ~0 w. a2 s6 [; A7 W
  if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_4) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}% D+ v) b( \5 \8 \0 S
  sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
9 w& U" l( h- K! w  sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
0 m1 {; [7 F7 F  sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;$ r# d! K# C7 d' F' E
  sBreakDeadTimeConfig.DeadTime = 0;3 A9 u. w9 l7 a, D' L9 R9 C
  sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;& R: v( F1 ~0 x3 y# `' Y" ^
  sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_LOW;, b  W# U4 p/ O% E/ z
  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
; m' C$ V8 W3 {4 u  if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}6 s* f7 g5 ~/ p; P  h( Q* |& n, d
  HAL_TIM_MspPostInit(&htim1);3 K8 z" a7 m) X- a5 t% g
}
; L6 ?9 V7 K$ E  ^htim1.Init.Period = 499;7 k, o7 h4 ?' J- f
改变499可以改变输出频率,改变PWM输出频率周期,尝试过10K[设置为9]输出波形很好。
. T0 `" x' X9 N9 }) ~+ v顺便在此节将Systick也做了测试,将原来主函数中的程序计数器js变量放在systick函数中加1,主程序中判断超出999999清零。代码分别如下:
: r% X4 U# d- @6 h在main后边添加systick函数:
% F& a7 U8 q  I: Q3 C! Q# ^//Systick Return
! f/ L! c4 E& wvoid HAL_SYSTICK_Callback(void){
/ O2 e" Y7 p5 o0 M  tickCnt++;
3 J% z$ c( j1 n1 d. e8 a  if(10==tickCnt){tickCnt=0;js++;}//改变10可以改变计数速度
, n5 t" Y9 j, Q" p* \}& \. S% A1 K, [
更改void SystemClock_Config(void)函数最后部分的:
& T0 |3 c2 H5 D  q$ D& y1 mHAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);! O. x2 Z4 Z" [4 H. r0 D' p" r
后边的实数可以改变Systick中断时间,如上大约为1ms中断一次,每10次js增加1。
4 j- i1 b8 M( F. F2 \
" d7 l1 z- o/ R( G

23-3

23-3

23-3

23-3

23-3

23-3

23-3

23-3

23-3

23-3

23-3

23-3
收藏 评论2 发布时间:2019-1-2 10:19

举报

2个回答
wangbs2-54840 回答时间:2019-1-3 21:34:46
myma2018 回答时间:2019-3-30 23:01:58
楼主大大厉害
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版