首页 > 其他分享 >定时器之PWM

定时器之PWM

时间:2023-08-18 21:56:07浏览次数:42  
标签:TIM2 TimeBaseInitStructure ENABLE TIM 定时器 GPIO PWM RCC

 

 

void PWM_Init(void)
{
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE); 
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);  //关闭复用引脚的其它默认功能(JTDI调试)
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //因为定时器控制引脚,就时复用推挽(一般的是数据寄存器控制的)
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;        //GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    TIM_InternalClockConfig(TIM2);
    
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;        //ARR   周期
    TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1;        //PSC   分频
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;  //固定占空比0-100
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
    
    TIM_OCInitTypeDef TIM_OCInitStructure;
    TIM_OCStructInit(&TIM_OCInitStructure); //给结构体赋初始值,避免TIM由低到高不兼容(或者就把左右的参数都罗列并赋值)
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //高电平有效
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = 0;        //CCR 设置其值
    TIM_OC1Init(TIM2, &TIM_OCInitStructure);
    
    TIM_Cmd(TIM2, ENABLE);
}
View Code
void PWM_SetCompare1(uint16_t Compare)
{
    TIM_SetCompare1(TIM2, Compare);
}

 

 通过输出比较,拿到PWM波形

常用函数

TIM_CtrlPWMOutputs()   在使用高级定时器时,调用这个函数使能主输出

用TIM_SetCompare1()该函数来配置CCR寄存器的值,通过与ARR数值关系,得到PWM输出占空比

通道与GPIO的关系

PSC分频  ARR周期

当需要一个频率为1000  占空比50%  分辨率为1%  带入计算即可   CK_PSC=72*10^6

 引脚重映射提供更改一次的机会,但是重映射表里面没有的话就不能更改

使用引脚映射:TIM2_CH1可以从PA0重映射到PA15 (用到AFIO复用)

why?因为GPIO要经过AFIO到定时器再到NVIC才能实现

 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);  //部分重映射   (上面两句一般情况下就够用了,若是遇到硬骨头,比如正好遇到又是调试端口的就需要下一句解除其身份)
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);  //关闭复用引脚的其它默认功能(JTDI调试)

再用AFIO将JTAG复用解除

 

标签:TIM2,TimeBaseInitStructure,ENABLE,TIM,定时器,GPIO,PWM,RCC
From: https://www.cnblogs.com/liujinmeng/p/17641547.html

相关文章

  • ESP32C3 LEDC_PWM
    LEDC_PWM   LED控制器(LEDC)主要用于控制LED,也可产生PWM信号用于其他设备的控制,ESP32C3有6路通道。设置LEDC通道分三步完成。与ESP32不同,ESP32-C3仅支持设置通道为低速模式。定时器配置指定PWM信号的频率和占空比分辨率。通道配置绑定定时器和输出PWM信......
  • TMS320F28335 ePWM中断函数里不能关时钟?实际上是关时钟之后不能清中断
    最近发现一个很奇怪的现象,如标题,为此写了一个简单的程序来验证这个问题,下面是部分代码:1voidInitEPwm2Gpio(void)2{3EALLOW;4GpioCtrlRegs.GPAPUD.bit.GPIO2=0;//使能上拉5GpioCtrlRegs.GPAMUX1.bit.GPIO2=1;//将GPIO2配置为EPWM2A......
  • 单片机原理2:定时器和中断
    定时器定时器寄存器:TMOD:方式寄存器,设定定时器0和定时器1的工作方式C/T:0为定时,1为计数TCON:控制寄存器,可位寻址TCON:TF1|TR1|TF0|TR0|IE1|IT1|IE0|IT0前面四位用于定时/计数,后面四位用于控制外部中断两个模式:定时和计数模式中断:主程序因为随机事件发生,暂停现行程序的运行,......
  • prometheus的sdk client_golang 使用 定时器
    之前线上监控的agent都是直接  time.Sleep(time.Duration(collectInterval)*time.Second),多少有些许的low,每次开始采集数据的时间都是从程序开始执行就开始采集,很显然这种偷懒的方式是不合理的。1、简单复制粘贴一下funcAbNormalLoglistener(collectIntervalint){......
  • 清除定时器clearLnterval
      ......
  • 定时器setInterval
      ......
  • Swift Timer 定时器
    importSwiftUIstructTimerView:View{@Statevarcount1:Int=0@Statevarcount2:Int=0@Statevarcount3:Int=0//timer1创建@Statevartimer1:Timer?//timer2创建lettimer2=Timer.publish(every:1.0,on:.main......
  • FP6276兼容G5177C,高效5V2A同步PWM升压DC转换器
    FP6276是一款电流模式同步升压型DC-DC转换器,pwm/psm控制。它的pwm电路,内置55mΩ高侧开关和55mΩ低侧开关使该调节器具备高节能。内部补偿网络也最大限度地减少多达6个外部元件数量。误差放大器的非反相输入端连接到一个0.6v精度参考电压和内部软启动功能可降低浪涌电流。FP6276是......
  • 定时器之setTimeout
      ......
  • Mitsubishi 三菱FXPLC入门之定时器和计数器
    “小时候总想着,自己要是可以控制时间就好了,给时间按下暂停键,然后把班里的那个死对头打一顿哈哈哈哈哈嗝,做梦呢。虽然我不可以控制时间,但是我可以通过定时器控制PLC的程序执行呀,这也是从另一方面实现我控制时间的的梦想了,激动!PLC中,定时器和计数器是两个非常主要的编程元件......