STM32利用通用定时器输入PWM

开发环境:

Ubuntu16.04 + SW4STM32 + STM32CubeMX + STM32F103C8T6

 

首先在STM32CubeMX中配置定时器。

204417_Qijc_1041082.png

修改IO速度为high,试了下不修改,好像也没啥影响。

204640_o6co_1041082.png

tim.c中修改如下。
主要涉及3个参数,
Prescaler:预分频器,用来将系统始终分频后提供给定时器。定时器时钟 = 系统时钟 / (Prescaler + 1)
Period:PWM的周期,其为定时器时钟周期个数,而非具体时间
pulse: PWM的占空比,范围为0~100


+#define TIMER_FREQ    2000000
+
+  // the period is 1000 time clock, when Prescaler is 35, that is 2K Hz
+  uint32_t period = 100; // 100:20K Hz
+  uint32_t pulse = 0;


void MX_TIM2_Init(void)
{
   ......
+  /* Compute the prescaler value to have TIM2 counter clock equal to 2000000 Hz */
+  uint32_t uhPrescalerValue = (uint32_t)(SystemCoreClock / TIMER_FREQ) - 1;
 
   htim2.Instance = TIM2;
-  htim2.Init.Prescaler = 0;
+  htim2.Init.Prescaler = uhPrescalerValue;
   htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
-  htim2.Init.Period = 0;
+  htim2.Init.Period = period;


  sConfigOC.OCMode = TIM_OCMODE_PWM1;
- sConfigOC.Pulse = 0;
+ sConfigOC.Pulse = pulse;



+void PWM_Start(uint32_t freq, uint32_t duty)
+{
+    period = TIMER_FREQ / freq;
+    pulse = period * duty / 100;
+
+    MX_TIM2_Init();
+
+    if (HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1) != HAL_OK)
+    {
+      /* PWM Generation Error */
+      Error_Handler();
+    }
+}

tim.h中添加PWM_Start的声明。

+ void PWM_Start(uint32_t freq, uint32_t duty);

然后调用PWM_Start()并传入频率和占空比就可以了。

 

转载于:https://my.oschina.net/igiantpanda/blog/1611408

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值