我这个没有调试过;仅作参考。
//=============================================================================
//定时器4初始化,向上计数,自动装载,作为PWM,在Pb6~Pb9输出,
void Tim4_Init(void)
{
// volatile uint32_t tpdw1;
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitdata; //基本参数
TIM_OCInitTypeDef TIM_OCInitStructure; //PWM输出,
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); //开启tim4的clk,
RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4,ENABLE); //通过对应位设置使Tim4寄存器复位,
RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4,DISABLE); //退出复位,
//----Pb6~Pb9对应GPIO口初始化----------------------------------------------------
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //开启GPIOB时钟,
GPIO_InitStructureGPIO_Pin = GPIO_Pin_6|GPIO_Pin_7
|GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructureGPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructureGPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
//----Tim4基本参数的初始化----------------------------------------------------
TIM_TimeBaseInitdataTIM_Prescaler = 0x0; //设置tim的预分频系数=0,72M全频,
TIM_TimeBaseInitdataTIM_ClockDivision = TIM_CKD_DIV1; //设置tim的时钟分频因子,Tdts=nTck_int,
TIM_TimeBaseInitdataTIM_CounterMode = TIM_CounterMode_Up; //向上计数,
TIM_TimeBaseInitdataTIM_Period = 0x3fff; //设置tim的自动重载,14位分辨率约439K,
TIM_TimeBaseInitdataTIM_RepetitionCounter = 0x00; //仅用于tim1&tim8,
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitdata);
TIM_ARRPreloadConfig(TIM4,ENABLE); //允许Tim2计数器的ARR自动重载缓冲,
//----Tim4的CHx_PWM的初始化参数,-----------------------------------------------
TIM_OCInitStructureTIM_OCMode=TIM_OCMode_PWM1; //设置OC1M[2:0]为pwm1输出模式,OC1REF="1"为有效,
TIM_OCInitStructureTIM_Pulse=0x1fff; //设置占空比时间,值将自动写入CCR1,
TIM_OCInitStructureTIM_OCPolarity=TIM_OCPolarity_High; //设置输出极性,CCER的CC1P位,实际1=OC1REF的有效电平,
TIM_OCInitStructureTIM_OutputState=TIM_OutputState_Enable; //使能该通道输出,CCER的CC1E位,
//----高级定时器才有的参数,----------------------------------------------------
TIM_OCInitStructureTIM_OCIdleState=TIM_OCIdleState_Reset; //空闲/死区输出状态=0,Timx_CR2的OISx,只有Tim1/8有,
TIM_OCInitStructureTIM_OCNIdleState=TIM_OCNIdleState_Reset; //空闲/死区输出状态=0,Timx_CR2的OISxN,只有Tim1/8有,
TIM_OCInitStructureTIM_OCNPolarity=TIM_OCNPolarity_High; //设置互补端输出极性,CCER的CC1NP位,
TIM_OCInitStructureTIM_OutputNState=TIM_OutputNState_Disable; //无互补端输出,CCER的CC1NE位,
//----按照指定参数初始化TIM_OC1~4,
TIM_OC1Init(TIM4,&TIM_OCInitStructure); //按照指定参数初始化TIM_OC1,
TIM_OC1FastConfig(TIM4,TIM_OCFast_Enable); //开启快速输出模式,3周期,
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM2在CCR1上的预装载寄存器,CCMR1_OC1PE=1,
TIM_OC2Init(TIM4,&TIM_OCInitStructure); //按照指定参数初始化TIM_OC2,
TIM_OC2FastConfig(TIM4,TIM_OCFast_Enable); //开启快速输出模式,3周期,
TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM2在CCR2上的预装载寄存器,CCMR1_OC2PE=1,
TIM_OC3Init(TIM4,&TIM_OCInitStructure); //按照指定参数初始化TIM_OC3,
TIM_OC3FastConfig(TIM4,TIM_OCFast_Enable); //开启快速输出模式,3周期,
TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM2在CCR3上的预装载寄存器,CCMR2_OC3PE=1,
TIM_OC4Init(TIM4,&TIM_OCInitStructure); //按照指定参数初始化TIM_OC4,
TIM_OC4FastConfig(TIM4,TIM_OCFast_Enable); //开启快速输出模式,3周期,
TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM2在CCR4上的预装载寄存器,CCMR2_OC4PE=1,
//----定时器启动-----------------------
TIM_ITConfig(TIM4,TIM_IT_Update,DISABLE); //关中断,
TIM_ClearFlag(TIM4,TIM_FLAG_Update); //必须先清除配置时候产生的更新标志,
TIM_Cmd(TIM4,ENABLE); //使能定时器,
}
实现 DSP 芯片输出死区时间可调的 PWM 波形需要按照以下步骤进行 *** 作:
1 选择适合的 DSP 芯片和开发板,如 TMS320F28335。
2 根据具体需求编写 PWM 模块的程序。
3 确定死区时间的控制方法。可以使用固定的时间,也可以通过 ADC 模块读取外部电压来动态调整死区时间。
4 在程序中加入死区时间的计算和设置模块。
5 配置 PWM 模块输出的周期、占空比和相位差。
6 调试程序并验证输出波形的正确性。
具体实现方式需根据所选的 DSP 芯片和开发环境进行调整,建议参考相关资料或进行实验验证。
因为你用的PWM频率较高,而80C51没有专用的硬件去产生PWM,所以只能用软件模拟的方法去不断翻转端口产生波形。这样的结果就是大部分的时间都被用在产生PWM波形上,就不能再做别的事情了。
解决的办法是,用专用的硬件去产生PWM波形,现在的单片机可以将定时器配置成PWM发生器。这样只要配置好几个寄存器,就能产生PWM波形而不需要程序去管理,这样程序就能做别的事情了。
以上就是关于STM32F103求配置一个PWM输出的程序,要求如下全部的内容,包括:STM32F103求配置一个PWM输出的程序,要求如下、怎么实现dsp芯片输出死区时间可调的pwm波形、单片机温度控制,PWM波输出问题。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)