配置TIM3输出PWM信号笔记

本文详细解析了STM32中TIM3定时器的PWM配置过程,包括时基初始化、输出模式初始化及比较寄存器设置。通过具体代码示例,介绍了如何配置TIM3实现1ms高电平的PWM信号输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

static void TIM3_Mode_Config(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;

    /*设置1ms 高电平*/
     u16 CCR1_Val =10;        

  /* Time base configuration */         
  TIM_TimeBaseStructure.TIM_Period = 199;       //当定时器从0计数到199,即为200次,为一个定时周期
  TIM_TimeBaseStructure.TIM_Prescaler =7199;        //设置分频:7200  (72,000,000/7200=10,000=0.1ms)
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;    //设置时钟分频系数:不分频
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数模式
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

  /* PWM1 Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;        //配置为pwm模式一
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;    
  TIM_OCInitStructure.TIM_Pulse = CCR1_Val;      
//设置跳变值,当计数器计数到这个值时,电平发生跳变
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //当定时器计数值小于CCR1_Val时为高电平
  TIM_OC1Init(TIM3, &TIM_OCInitStructure);     //使能通道1
  TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);

  TIM_ARRPreloadConfig(TIM3, ENABLE);             //使能TIM3重载寄存器ARR

  /* TIM3 enable counter */
  TIM_Cmd(TIM3, ENABLE);                  
//使能定时器3
}

TIM3_Mode_Config()函数被分为三部分:时基初始化,输出模式初始化,比较寄存器的数值。

首先是时基初始化,使用了一个TIM_TimeBaseInitTypeDef  类型的结构体。时基初始化配置基本定时器具有的那一部分功能。

时基初始化:

  • TIM_Period:定时周期,脉冲计数器从0累加到这个值上溢或从这个值自减至0下溢。若给该成员赋值为199,即定时周期为(199+1) \times T,T为时钟源周期。
  • TIM_Prescaler :对定时器时钟TIMxCLK的预分频值,分频后为脉冲计数器TIMxCLK的驱动时钟,得到脉冲计数器的时钟频率为f_{CK-CNT}=f_{TIMxCLK}/(N+1),其中N为赋给本成员的值。
  • TIM_CounterMode 配置脉冲计数器TIM_CNT的计数模式:向上计数,向下计数,中央对齐计数
STM32F103 舵机 代码#include "led.h" #include "delay.h" #include "key.h" #include "sys.h" #include "exti.h" #include "timer.h" #include "usart.h" #include "IWDG.h" //int main(void) //中断 //{ //delay_init(); //LED_Init(); //KEY_Init(); //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //EXTIX_Init(); //LED=0; //while(1); //} //int main(void) //定时器中断 //{ // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // delay_init(); // LED_Init(); // // TIM3_Int_Init(1999,7199);//((1+7199)/72M)*(1+9999)=1秒*/反 // while(1); //} int main(void) //pwm { // u16 ledpwmval=0; // u8 dir=1; delay_init(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); uart_init(115200); LED_Init (); TIM3_PWM_Init(199,7199);//50Hz 0.02s=20ms 2.5ms while(1) { delay_ms(10); // if(dir)ledpwmval++; // else ledpwmval --; // if(ledpwmval >1000) // dir=0; // if(ledpwmval ==0) // dir=1; TIM_SetCompare2(TIM3,5); delay_ms(500); TIM_SetCompare2(TIM3,10); delay_ms(500); TIM_SetCompare2(TIM3,15); delay_ms(500); TIM_SetCompare2(TIM3,20); delay_ms(500); TIM_SetCompare2(TIM3,25); delay_ms(500); } } //int main() //串口 //{ // u16 t; // u16 len; // u16 times=0; // delay_init(); // NVIC_PriorityGroupConfig (NVIC_PriorityGroup_2 ); // uart_init(115200); // LED_Init(); // KEY_Init(); // while(1) // { // if(USART_RX_STA&0x8000) // { // len=USART_RX_STA&0x3fff;//得到此次接收的数据长度 // printf("\r\n您发送的消息为:\r\n\r\n"); // for(t=0;t<len;t++) // { // USART_SendData(USART1,USART_RX_BUF[t]); // while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET); // } // printf("\r\n\r\n");//插入换行 // USART_RX_STA=0; // } // else // { // times++; // if(times%500000==0) // { // LED=!LED; // } // } // } //} //extern void TIM4_Cap_Init(u16 arr,u16 psc); //extern u8 TIM4CH1_CAPTURE_STA; //输入捕获状态 输入捕获实验
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值