STM32 | 精确控制PWM脉冲个数

三世轮回 提交于 2020-11-28 23:56:19



(图片与文章内容无关,来源于网络)


精确控制PWM个数采用的是主从方案, TIM3产生PWM,为TIM2提供时钟,然后TIM2计数



测试代码如下(待完善),仅供参考

主要的文件就是time.c文件


main.c文件

#include "stm32f10x.h"#include "time.h"#include "usart.h"
void Delay(unsigned int Time){ if(Time == 0) return; while(Time--);}
int main(){ //NVIC_  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); TIM2_init(7199,999);/// 1/10=0.01 TIM3_init(7199,99);/// 1/100=0.1 //99 usart1_init(115200); //SetPWMValue(TIM2,1,500); SetPWMValue(TIM3,1,50); UartPutChar(USART1,0X56); while(1) { // UartPutChar(USART1,0X56); Delay(100); if(flag==1) { TIM3_init(7199,(100+time_count*100)-1); SetPWMValue(TIM3,1,50); if(time_count==10) { time_count=0; TIM_Cmd(TIM3,DISABLE); }
flag=0; } ; }
}


time.c文件

#include "stm32f10x.h"#include "time.h"

/************************T2的定时器初始化*************************/void TIM2_init(unsigned int pres,unsigned int period) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitTypeStruct; NVIC_InitTypeDef NVIC_InitTypeStruct; TIM_OCInitTypeDef TIM_OCInitTypeStruct; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //TIM_TimeBaseInitTypeStruct.TIM_Prescaler=pres; TIM_TimeBaseInitTypeStruct.TIM_CounterMode=TIM_CounterMode_Up; //TIM_TimeBaseInitTypeStruct.TIM_Period=period; TIM_TimeBaseInitTypeStruct.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitTypeStruct); TIM_ITConfig(TIM2,TIM_IT_Trigger,ENABLE); NVIC_InitTypeStruct.NVIC_IRQChannel=TIM2_IRQn; NVIC_InitTypeStruct.NVIC_IRQChannelPreemptionPriority=2; NVIC_InitTypeStruct.NVIC_IRQChannelSubPriority=2; NVIC_InitTypeStruct.NVIC_IRQChannelCmd=ENABLE;  NVIC_Init(&NVIC_InitTypeStruct); TIM_SelectInputTrigger(TIM2,TIM_TS_ITR2); TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_External1); TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_Enable); TIM_Cmd(TIM2,ENABLE); }

/************************T3输出PWM控制T2的计数*************************/
void TIM3_init(unsigned int pres,unsigned int period) { GPIO_InitTypeDef GPIO_InitTypeStruct; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitTypeStruct; TIM_OCInitTypeDef TIM_OCInitTypeStruct; NVIC_InitTypeDef NVIC_InitTypeStruct; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE); GPIO_InitTypeStruct.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7; GPIO_InitTypeStruct.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_InitTypeStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitTypeStruct); TIM_TimeBaseInitTypeStruct.TIM_Prescaler=pres; TIM_TimeBaseInitTypeStruct.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInitTypeStruct.TIM_Period=period; TIM_TimeBaseInitTypeStruct.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitTypeStruct); // TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); TIM_OCInitTypeStruct.TIM_OCMode=TIM_OCMode_PWM1; TIM_OCInitTypeStruct.TIM_OutputState=TIM_OutputState_Enable; TIM_OCInitTypeStruct.TIM_Pulse=0; TIM_OCInitTypeStruct.TIM_OCPolarity=TIM_OCPolarity_High; TIM_OCInitTypeStruct.TIM_OCIdleState=TIM_OCIdleState_Set; TIM_OC1Init(TIM3,&TIM_OCInitTypeStruct);
// //Master TIM_CtrlPWMOutputs(TIM3,ENABLE); TIM_Cmd(TIM3,ENABLE);

TIM_SelectOutputTrigger(TIM3,TIM_TRGOSource_OC1Ref ); TIM_SelectMasterSlaveMode(TIM3,TIM_MasterSlaveMode_Enable); }unsigned char time_count0=0;unsigned char time_count=0;unsigned char flag=0;void TIM2_IRQHandler(){ TIM_TimeBaseInitTypeDef TIM_TimeBaseInitTypeStruct; if(TIM_GetITStatus(TIM2,TIM_IT_Trigger)!=RESET) {     /* T2 TIM_SlaveMode_Gated time_count0++;放在本函数前面 //TIM2_init(7199,99);/// 1/10=0.01 //TIM3_init(7199,99);/// 1/100=0.01 count 1 /pwm 0 个脉冲 count 2 /pwm 2 个脉冲 count 3 /pwm 4 个脉冲 count 4 /pwm 6 个脉冲 //TIM2_init(7199,999);/// 1/10=0.1 //TIM3_init(7199,99);/// 1/100=0.01 count 1 /pwm 0 个脉冲 count 2 /pwm 20 个脉冲 count 3 /pwm 40 个脉冲 count 4 /pwm ?个脉冲 //TIM2_init(7199,99);/// 1/10=0.1 //TIM3_init(7199,999);/// 1/100=0.01 count 1 /pwm 0 个脉冲 count 2 /pwm 2 个脉冲 count 3 /pwm 4 个脉冲 count 4 /pwm 6 个脉冲 */ /* T2 TIM_SlaveMode_Trigger模式 T3每产生一次PWM脉冲将会使T2计数一次 */ if(time_count0==11) // { time_count++; SetPWMValue(TIM3,1,0); flag=1;      UartPutChar(USART1,time_count0);// // time_count0=0; //TIM_Cmd(TIM2,DISABLE); } time_count0++;
/* T2 TIM_SlaveMode_Gated time_count0++;放在本函数后面 //TIM2_init(7199,99);/// 1/10=0.01 //TIM3_init(7199,99);/// 1/100=0.01 count 1 /pwm 2 个脉冲 count 2 /pwm 4 个脉冲 count 3 /pwm 6 个脉冲 count 4 /pwm 8 个脉冲 //TIM2_init(7199,999);/// 1/10=0.1 //TIM3_init(7199,99);/// 1/100=0.01 count 1 /pwm 20 个脉冲 count 2 /pwm 40 个脉冲 count 3 /pwm 60 个脉冲 count 4 /pwm ?个脉冲 //TIM2_init(7199,99);/// 1/10=0.1 //TIM3_init(7199,999);/// 1/100=0.01 count 1 /pwm 2 个脉冲 count 2 /pwm 4 个脉冲 count 3 /pwm 6 个脉冲 count 4 /pwm 8 个脉冲 */ TIM_ClearITPendingBit(TIM2,TIM_IT_Trigger); } }

void SetPWMValue(TIM_TypeDef* TIMx,unsigned char channel,unsigned int data){ if(channel==1) { TIM_SetCompare1(TIMx,data); } else if(channel==2) { TIM_SetCompare2(TIMx,data); } else if(channel==3) { TIM_SetCompare3(TIMx,data); } else if(channel==4) { TIM_SetCompare4(TIMx,data); }}

以上为相关程序代码,其他的.h文件可自行添加 很简单

  

       

本文分享自微信公众号 - 嵌入式软硬件爱好者(qrsfan)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!