TIM2产生单脉冲时,选择TIM1的CH1的OC1REF作为内部触发信号,先设置TIM1—CR2寄存器的MMS位为001
对应标准库函数: TIM_SelectOutputTrigger(TIM1,TIM_TRGOSource_OC1Ref);
在TIM2_SMCR寄存器的TS位选择内部触发0
对应库函数: TIM_SelectInputTrigger(TIM2, TIM_TS_ITR0);//定时器1内部触发
示波器通道1是tim2输出,通道2是tim1输出
/**************************************************************************************************************
*以下TIM1和TIM2的设置实现TIM1输出40hz,占空比7%即高电平输出180us,TIM2输出单脉冲,周期360us,占空比50%,TIM2的触发是TIM1的OC1REF信号。
TIM2设置单脉冲需设置的参数:
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_SelectOnePulseMode(TIM2,TIM_OPMode_Single);//单脉冲
TIM_SelectInputTrigger(TIM2, TIM_TS_ITR0);//定时器1内部触发
TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Trigger);
TIM_SelectOutputTrigger(TIM1,TIM_TRGOSource_OC1Ref);//在TIM1的初始化函数中,设置TIM1->CR2的MMS位100:比较 – OC1REF 信号被用于作为触发输出 (TRGO)。
****************************************************************************************************************************************/
void TIM1_PWM_Config(FunctionalState flag)
{
uint16_t TimerPeriod = 0,PrescalerValue = 0,time2_Channel1Pulse;
/* TIM2 的配置 ---------------------------------------------------
SystemCoreClock 为48 MHz
定时器时钟1000000hz
输出频率40hz
占空比:7%,高脉冲180us
*/
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
// TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
/*计算预定表的值,也就是多少个时钟计数为一个周期*/
//TimerPeriod = (SystemCoreClock / 17570 ) - 1;//17570
/*计算CCR1 跳转值 在占空比为50%时*/
//time2_Channel1Pulse = (uint16_t) (((uint32_t) 5 * (TimerPeriod - 1)) / 10);
// /*计算CCR2 跳转值 在占空比为37.5%时*/
// Channel2Pulse = (uint16_t) (((uint32_t) 375 * (TimerPeriod - 1)) / 1000);
// /*计算CCR3 跳转值 在占空比为25%时*/
// Channel3Pulse = (uint16_t) (((uint32_t) 25 * (TimerPeriod - 1)) / 100);
// /*计算CCR4跳转值 在占空比为12.5%时*/
// Channel4Pulse = (uint16_t) (((uint32_t) 125 * (TimerPeriod- 1)) / 1000);
PrescalerValue = (unsigned int) (48000000 / 1000000) - 1;
TimerPeriod = (unsigned int)( 1000000 / 40 ) - 1;
time2_Channel1Pulse = (uint16_t) (((uint32_t) (7) * (TimerPeriod - 1)) / 1000);
/* TIM1 时钟使能 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE);
/* Time 定时基础设置*/
TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /* Time 定时设置为上升沿计算模式*/
TIM_TimeBaseStructure.TIM_Period = TimerPeriod;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
/* 频道1,2,3,4的PWM 模式设置 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
// TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//TIM_OCPolarity_Low
// TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;//TIM_OCNPolarity_High//控制CH1N引脚的极性,这样配置是CH1和CH1N两引脚电平相反,TIM_OCNPolarity_High时电平相同
// TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
// TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
TIM_OCInitStructure.TIM_Pulse = time2_Channel1Pulse;//使能频道1配置
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
// TIM_OCInitStructure.TIM_Pulse = Channel2Pulse;//使能频道2配置
// TIM_OC2Init(TIM1, &TIM_OCInitStructure);
// TIM_OCInitStructure.TIM_Pulse = Channel3Pulse;//使能频道3配置
// TIM_OC3Init(TIM1, &TIM_OCInitStructure);
// TIM_OCInitStructure.TIM_Pulse = Channel4Pulse;//使能频道4配置
// TIM_OC4Init(TIM1, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
// /*OC1PE:输出比较1预装载使能(Output compare 1 preload enable) 位3
// 0:禁止TIMx_CCR1寄存器的预装载功能,可随时写入TIMx_CCR1寄存器,并且新写入的数值立即起作用。
// 1:开启TIMx_CCR1寄存器的预装载功能,读写操作仅对预装载寄存器操作,TIMx_CCR1的预装载值在更新事件到来时被传送至当前寄存器中。*/
// TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
// TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
// TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
// TIM_BDTRInitStructure.TIM_DeadTime = 0; //死区时间0-0xff
// TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
// TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
// TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
// TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);
TIM_ARRPreloadConfig(TIM1, flag);
/* TIM1 计算器使能*/
// TIM_Cmd(TIM1, flag);
// TIM_ClearITPendingBit(TIM1, TIM_IT_CC1);//清除更新中断请求位
// TIM_ITConfig(TIM1,TIM_IT_CC1,flag);
// NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;
// NVIC_InitStructure.NVIC_IRQChannelPriority = 3;
// NVIC_InitStructure.NVIC_IRQChannelCmd = flag;//ENABLE;
// NVIC_Init(&NVIC_InitStructure);
// TIM_ITConfig(TIM1,TIM_IT_Update,flag);
// NVIC_InitStructure.NVIC_IRQChannel = TIM1_BRK_UP_TRG_COM_IRQn;
// NVIC_InitStructure.NVIC_IRQChannelPriority = 3;
// NVIC_InitStructure.NVIC_IRQChannelCmd = flag;//ENABLE;
// NVIC_Init(&NVIC_InitStructure);
TIM_SelectOutputTrigger(TIM1,TIM_TRGOSource_OC1Ref);
// /* TIM1 计算器使能*/
TIM_Cmd(TIM1, flag);
// /* TIM1 主输出使能 */
TIM_CtrlPWMOutputs(TIM1, flag);
}
/*****************************************************************************************
*函 数 名:TIM2_PWM_Config
*函数说明:定时器2配置
*形 参:定时器使能flag:ENABLE DISABLE
***************************************************************************************************/
void TIM2_PWM_Config(FunctionalState flag)
{
uint16_t TimerPeriod = 0,PrescalerValue = 0,time2_Channel1Pulse;
/* TIM2 的配置 ---------------------------------------------------
SystemCoreClock 为48 MHz
输出频率1/360us 占空比:50%,高脉冲180us
*/
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
// NVIC_InitTypeDef NVIC_InitStructure;
// TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
/*计算预定表的值,也就是多少个时钟计数为一个周期*/
TimerPeriod = (SystemCoreClock / 2770 ) - 1;//17570
/*计算CCR1 跳转值 在占空比为50%时*/
time2_Channel1Pulse = (uint16_t) (((uint32_t) 5 * (TimerPeriod - 1)) / 10);
// /*计算CCR2 跳转值 在占空比为37.5%时*/
// Channel2Pulse = (uint16_t) (((uint32_t) 375 * (TimerPeriod - 1)) / 1000);
// /*计算CCR3 跳转值 在占空比为25%时*/
// Channel3Pulse = (uint16_t) (((uint32_t) 25 * (TimerPeriod - 1)) / 100);
// /*计算CCR4跳转值 在占空比为12.5%时*/
// Channel4Pulse = (uint16_t) (((uint32_t) 125 * (TimerPeriod- 1)) / 1000);
// PrescalerValue = (unsigned int) (48000000 / 1000000) - 1;
// TimerPeriod = (unsigned int)( 1000000 / 40 ) - 1;
// time2_Channel1Pulse = (uint16_t) (((uint32_t) (14) * (TimerPeriod - 1)) / 1000);
/* TIM1 时钟使能 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , flag);
/* Time 定时基础设置*/
TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /* Time 定时设置为上升沿计算模式*/
TIM_TimeBaseStructure.TIM_Period = TimerPeriod;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
/* 频道1,2,3,4的PWM 模式设置 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
// TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//TIM_OCPolarity_Low
// TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;//TIM_OCNPolarity_High//控制CH1N引脚的极性,这样配置是CH1和CH1N两引脚电平相反,TIM_OCNPolarity_High时电平相同
// TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
// TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
TIM_OCInitStructure.TIM_Pulse = time2_Channel1Pulse;//使能频道1配置
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
// TIM_OCInitStructure.TIM_Pulse = Channel2Pulse;//使能频道2配置
// TIM_OC2Init(TIM1, &TIM_OCInitStructure);
// TIM_OCInitStructure.TIM_Pulse = Channel3Pulse;//使能频道3配置
// TIM_OC3Init(TIM1, &TIM_OCInitStructure);
// TIM_OCInitStructure.TIM_Pulse = Channel4Pulse;//使能频道4配置
// TIM_OC4Init(TIM1, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM2,
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』