找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 532|回复: 0
收起左侧

stm32f103 TIM3_CH1(PA6)为PWM输出 源程序

[复制链接]
ID:880573 发表于 2025-10-16 11:15 | 显示全部楼层 |阅读模式
  1. #include "stm32f10x.h"

  2. // 初始化TIM3_CH1(PA6)为PWM输出
  3. void TIM3_PWM_Init(uint16_t arr, uint16_t psc)
  4. {
  5.     GPIO_InitTypeDef GPIO_InitStructure;
  6.     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  7.     TIM_OCInitTypeDef TIM_OCInitStructure;

  8.     // 使能时钟
  9.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);    // 使能TIM3时钟
  10.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   // 使能GPIOA时钟

  11.     // 配置PA6为复用推挽输出(TIM3_CH1)
  12.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  13.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;         // 复用推挽输出
  14.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  15.     GPIO_Init(GPIOA, &GPIO_InitStructure);

  16.     // 初始化TIM3时基单元
  17.     TIM_TimeBaseStructure.TIM_Period = arr;                 // 自动重装载值
  18.     TIM_TimeBaseStructure.TIM_Prescaler = psc;              // 预分频值
  19.     TIM_TimeBaseStructure.TIM_ClockDivision = 0;            // 时钟分频
  20.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数
  21.     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

  22.     // 初始化TIM3_CH1为PWM模式
  23.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;       // PWM模式1
  24.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 使能输出
  25.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 输出极性高
  26.     TIM_OC1Init(TIM3, &TIM_OCInitStructure);                // 配置通道1

  27.     // 使能TIM3预装载寄存器
  28.     TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
  29.     TIM_ARRPreloadConfig(TIM3, ENABLE);

  30.     // 启动TIM3
  31.     TIM_Cmd(TIM3, ENABLE);
  32. }

  33. int main(void)
  34. {
  35.     uint16_t pwm_val = 0;
  36.     uint8_t dir = 1;

  37.     // 初始化系统时钟(72MHz)
  38.     SystemInit();

  39.     // 初始化TIM3:PWM频率 = 72MHz / [(psc+1)*(arr+1)]
  40.     // 此处配置为 72MHz/(71+1)/(999+1) = 1000Hz(1kHz)
  41.     TIM3_PWM_Init(999, 71);

  42.     while (1)
  43.     {
  44.         // 缓慢改变占空比(0~100%循环)
  45.         if (dir)
  46.             pwm_val++;
  47.         else
  48.             pwm_val--;

  49.         if (pwm_val > 999)
  50.             dir = 0;
  51.         if (pwm_val == 0)
  52.             dir = 1;

  53.         // 设置PWM占空比(通过比较值控制)
  54.         TIM_SetCompare1(TIM3, pwm_val);

  55.         // 延时约10ms
  56.         for (int i = 0; i < 720000; i++);
  57.     }
  58. }
复制代码

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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