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

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

[复制链接]
zhjb1 发布时间:2019-1-2 10:19
本帖最后由 zhjb1 于 2019-1-2 10:21 编辑 : g8 Q! i1 E8 {+ d/ t' Q) U
6 x0 Z  j. Q" b+ P# T
为了测试多路Timer本例选择了独立带有PWM输出的TIM1,3。只好用这2个TIMn来测试PWM。; D3 s; e8 j" j  f  r5 G
由于是独立的2个时钟,所以周期等都不同,分别依次为2KHz,5KHz。由于我的主频为内置8MHz,时钟树最高只能设到64MHz,按照这个来设置其它的。导出工程文件。  M- `* ~9 ^/ b9 C7 {+ p
当STM32CumeMX选设好后,可以在对应的tim.c中重新设置各项参数,还是很方便的。具体在STM32CubeMX中的TIM1的配置中截了3张图,分别是PING,Parment Settings和GPIO Settings,见图23_3_1~3。PWM2的Time3的设置与之相同之事频率为5K,设置值为199。
' Q! e+ v+ m3 Z在在自定义变量中添加变量:
* C; B. K7 _5 m6 Jint16_t pwm1=499,pwm3=199。4 j+ e$ {3 U. s9 a$ _8 h
main前添加LED测试程序,原来的减少到1个:1 [3 D. R$ w' `& C7 n7 c  s
//TEST LEDs
8 V$ ?' m! Q6 l# S' @void ledTest(void){* _- f- b; B. k: F; _; F
  if(HAL_GPIO_ReadPin(GPIOC,LED1_Pin)){# D6 [% V( L" K; B$ {% B
    HAL_GPIO_WritePin(GPIOC,LED1_Pin,GPIO_PIN_RESET);, ^* G  b& b+ @  L5 Y
  }else{, I5 z- x" K0 b
    HAL_GPIO_WritePin(GPIOC,LED1_Pin,GPIO_PIN_SET);
' v9 v9 _+ X" B8 T3 l& O" B$ ~3 A  }: e' W7 M6 E1 x0 }: d& N, D( ~/ E& C
}
7 H$ E8 E0 @( ~1 U- M在main的里面前边添加函数:$ Q- a% w. S7 j" Z5 M
MX_TIM1_Init();
2 X( V7 h7 v7 f MX_TIM3_Init();, t! t) Z3 A" N0 O
HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_4);//PA_11_2KHz
- w, o0 K$ A6 L HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);//PB_5__5KHz
4 v7 l, h; q9 A( @* |) |在循环体中添加:
& `) a- E" o2 X1 ]& c1 B   ledTest();5 d2 f3 X  u# u1 w# }0 j9 e8 j' j
   HAL_Delay(10);/ Q9 y" M0 Y- G9 |
   adc_getvalue();
/ u% y$ K, [9 F9 O   if(pwm1<490)pwm1+=4;else pwm1=10; TIM1->CCR4=pwm1;//PA_11_2KHz
/ }, t6 ~, @$ p; H3 M   if(pwm3<195)pwm3+=2;else pwm3=5;  TIM3->CCR2=pwm3;//PB_5__5KHz; ]6 d' \5 E- ^! Y
编译下载,结果见组合照片23_3_4,波形见照片23_3_5和23_3_6。特别打开tim.c,可以看到TIM1的函数:+ }4 I) }* C+ w( M3 k" J
void MX_TIM1_Init(void){# h+ H$ U# [( I: d" k
  TIM_MasterConfigTypeDef sMasterConfig;0 Q# V& y* v* o) l4 {
  TIM_OC_InitTypeDef sConfigOC;
$ g. `2 U: X2 O, p  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;
9 m. W; d1 C$ a7 }7 V5 W: ~# j  htim1.Instance = TIM1;
, [/ l0 D2 U: E% W9 |  htim1.Init.Prescaler = 63;# Q3 w5 h# l7 w  Q. [( p
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;/ V! s' B1 U8 g9 U/ p9 C4 g2 T
  htim1.Init.Period = 499;, ~4 {$ D* o) E( G: P' ~( H$ D! f
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
/ J0 M$ B( J2 g. o0 x  htim1.Init.RepetitionCounter = 8;" Y. T* |/ j4 X& j5 J. f/ K
  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;. J+ {" G' t1 b- I2 T
  if (HAL_TIM_PWM_Init(&htim1) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}
7 E& r( \- w- M% d% w, @  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;- B! h( q( F) d$ X: _; ?: U
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
/ m( t+ [+ J/ z1 K$ R/ z& q  if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}+ F: N/ n+ p  Q* P& ~. H6 O
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
+ _. }( H4 Q  i/ `% t  sConfigOC.Pulse = 50;4 X2 i  d8 f5 L4 Y
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;6 G( {* D+ s: f; k+ |) \
  sConfigOC.OCFastMode = TIM_OCFAST_ENABLE;/ @' O& r+ y: f2 c3 F
  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;0 R2 Q  t+ m6 i0 I
  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
/ i9 b1 K2 B7 a$ e" y& s/ i: V  if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_4) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}" E( V3 @3 U$ S6 K; ~. ]2 J& d
  sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;9 S, ^8 P/ V) r# J% `8 ~) ?
  sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
0 }5 b5 b2 {1 _& @9 L  sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;  M" o5 q! r1 Y+ f* [
  sBreakDeadTimeConfig.DeadTime = 0;
3 |; n" d  B. w  }# R5 U3 b  sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
& e- ]8 G& A; Z) U  sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_LOW;
9 _9 q; s+ S- M' O( p9 a2 q! D  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
8 x0 r- X+ o& M' `% v  if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}( q, Q+ j5 c( B1 N. F
  HAL_TIM_MspPostInit(&htim1);
9 ~+ m# m1 U' o% G2 C}
0 y$ e* y, c: V2 b. e. Xhtim1.Init.Period = 499;3 E1 o# W; H9 P4 Z
改变499可以改变输出频率,改变PWM输出频率周期,尝试过10K[设置为9]输出波形很好。& W4 K) [9 g4 Y
顺便在此节将Systick也做了测试,将原来主函数中的程序计数器js变量放在systick函数中加1,主程序中判断超出999999清零。代码分别如下:# B' r2 d9 m1 J  K  ]* O; f, k
在main后边添加systick函数:
2 K: G7 i" ^2 l, O; v3 R//Systick Return
/ C  |. y. m8 S4 v) }2 x/ S" Bvoid HAL_SYSTICK_Callback(void){
- u  `) P; Z6 j& e% e  tickCnt++;
% e- N- k3 e5 q  h" |7 y  if(10==tickCnt){tickCnt=0;js++;}//改变10可以改变计数速度0 H- X8 T7 g/ A2 ]" M! h& i; Q  k
}
: M5 _+ Q& E* H) |3 S更改void SystemClock_Config(void)函数最后部分的:
# a! T9 i" I" T/ r: K9 CHAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
0 B& o' X; K$ m' L4 F4 K- |后边的实数可以改变Systick中断时间,如上大约为1ms中断一次,每10次js增加1。
( N' ?* ^& n! j
9 u. Y' i6 l6 L* B

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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版