STM32 定时器移相任意角度和占空比,频率可调

由于使用了中断修改翻转的CCR值,对于频率超250K以上不太适用.

void Motor1_Init(Motor MotorChValue)
{  

	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	/*设置中断*/	
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; 
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure); 

	/*时钟*/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);	
 	RCC_APB2PeriphClockCmd( MOTOR1_CLK | RCC_APB2Periph_AFIO, ENABLE);
	
	/*通道引脚*/  
	GPIO_InitStructure.GPIO_Pin = MOTOR1_A1_PIN | MOTOR1_B1_PIN | MOTOR1_A2_PIN | MOTOR1_B2_PIN; 
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(MOTOR1_A1_PORT, &GPIO_InitStructure);//初始化GPIO
	
	GPIO_InitStructure.GPIO_Pin = MOTOR1_A2_PIN | MOTOR1_B2_PIN; 
	GPIO_Init(MOTOR1_A2_PORT, &GPIO_InitStructure);
	
   
   //初始化TIM3
	TIM_TimeBaseStructure.TIM_Period = 65535; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
	TIM_TimeBaseStructure.TIM_Prescaler =72-1; //72分频,TIM3 = 1Mhz
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //1分频
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); 
	
	
	//初始化TIM3 Channel2 PWM模式	 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; 
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; 
	
	TIM_OCInitStructure.TIM_Pulse = MotorChValue.Ch1Value;
	TIM_OC1Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM4 OC1
	
	TIM_OCInitStructure.TIM_Pulse = MotorChValue.Ch2Value;
	TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM4 OC2
	
	TIM_OCInitStructure.TIM_Pulse = MotorChValue.Ch3Value;
	TIM_OC3Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM4 OC3
	
	TIM_OCInitStructure.TIM_Pulse = MotorChValue.Ch4Value;
	TIM_OC4Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM4 OC4
	
	TIM_ITConfig(TIM3, TIM_IT_CC1|TIM_IT_CC2|TIM_IT_CC3|TIM_IT_CC4,ENABLE);

	TIM_SetCounter(TIM3,0);
//	TIM_Cmd(TIM3, DISABLE);  
 
}

void  ConfigTimer(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef  TIM_OCInitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
  
  RCC_APB1PeriphClockCmd(  RCC_APB1Periph_TIM3,ENABLE);
  RCC_APB2PeriphClockCmd(  RCC_APB2Periph_GPIOB,ENABLE);
  
  TIM_DeInit(TIM3);
  TIM_TimeBaseStructure.TIM_Prescaler = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1;
  TIM_TimeBaseStructure.TIM_Period = (Fsys/2) / Fpwm;
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
  
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputState_Disable;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
  TIM_OCInitStructure.TIM_Pulse = (((Fsys/2) / Fpwm) * PWM_DUTY) / 100;
  TIM_OC3Init(TIM3,&TIM_OCInitStructure);
  
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  TIM_OCInitStructure.TIM_Pulse = (((Fsys/2) / Fpwm) * (100-PWM_DUTY)) / 100;
  TIM_OC4Init(TIM3,&TIM_OCInitStructure);
  
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 | GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  
  TIM_CtrlPWMOutputs(TIM3, ENABLE);
  TIM_Cmd(TIM3,ENABLE);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
高级定时器STM32F4系列微控制器中的一种功能强大的定时器。它可以用于测量频率占空比。在你提供的引用中,引用\[2\]是一个头文件,其中包含了一个函数`TIM13_PWM_Init`,该函数用于初始化定时器13作为PWM输出。通过配置定时器的参数,可以实现测量频率占空比的功能。 要测量频率,可以使用定时器的输入捕获功能。通过配置定时器的输入捕获通道,可以捕获外部信号的上升沿或下降沿,并记录捕获到的时间戳。通过计算时间戳之间的差值,可以得到信号的周期,从而计算出频率。 要测量占空比,可以使用定时器的输出比较功能。通过配置定时器的输出比较通道,可以生成一个占空比可调的PWM信号。通过测量PWM信号的高电平时间和周期,可以计算出占空比。 具体的实现方法可以参考STM32F4系列微控制器的参考手册和相关的开发文档。根据你提供的引用,可以看出你已经在使用定时器13进行PWM输出的初始化,接下来可以根据需要配置输入捕获通道或输出比较通道,并编写相应的代码来实现频率占空比的测量。 #### 引用[.reference_title] - *1* [STM32F4 频率 占空比可调方波发生器 ---学华为造轮子](https://blog.csdn.net/zzlwl/article/details/114882800)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [STM32f4日记1之输出pwm波(用按键调整频率占空比,可用示波器观察结果)](https://blog.csdn.net/qq_51564898/article/details/111398486)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值