我实在别人的基础上改的程序,出处:
http://www.openedv.com/forum.php ... mp;page=1#pid604070 我使用TIM3在单脉冲模式下工作,控制TIM2输出精确个数的pwm脉冲,PB10为TIM2的重映射功能。(同时另外两个引脚输出高电平,但这个不影响其它应该)软件仿真,PB10一直没有脉冲输出,请大家帮忙看看代码,指导一下有什么问题?提前谢谢了。
#include "stm32f10x.h"#include "tim.h" void TIM2_TIM3_PWM(u16 Cycle, u16Pulse_Num); void Motor_Init(u16 TIM3per, u16 TIM2per,u16 TIM2Compare1); int main(void){ Motor_Init(1000, 1000, 1000); TIM2_TIM3_PWM(1000, 1500); GPIO_SetBits(GPIOB,GPIO_Pin_1);GPIO_SetBits(GPIOB,GPIO_Pin_11); while (1); // add your code;} #include "tim.h" void Motor_Init(u16 TIM3per, u16 TIM2per,u16 TIM2Compare1) { TIM_TimeBaseInitTypeDefTIM_TimeBaseInitStruct; TIM_OCInitTypeDef TIM_OCInitStruct; GPIO_InitTypeDef GPIO_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 |RCC_APB1Periph_TIM3,ENABLE);//
打开时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOB,ENABLE);//
打开时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//
打开复用时钟 GPIO_PinRemapConfig(GPIO_FullRemap_TIM2,ENABLE); //
重映射时钟 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;//
复用推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;// GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin= GPIO_Pin_1 | GPIO_Pin_11;// I/O
输出 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_PinRemapConfig(GPIO_FullRemap_TIM2,ENABLE); //
完全重映射 //TIM3
工作在单脉冲模式下 TIM_TimeBaseInitStruct.TIM_ClockDivision =TIM_CKD_DIV1; TIM_TimeBaseInitStruct.TIM_CounterMode =TIM_CounterMode_Up; TIM_TimeBaseInitStruct.TIM_Prescaler= 7200; TIM_TimeBaseInitStruct.TIM_Period = TIM3per; TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct); TIM_SelectOnePulseMode(TIM3,TIM_OPMode_Single);//
单脉冲配置 TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);//
使能预装载 TIM_SelectOutputTrigger(TIM3,TIM_TRGOSource_OC1Ref);//
作为触发输出 TIM_OCInitStruct.TIM_OCMode =TIM_OCMode_PWM2; TIM_OCInitStruct.TIM_OutputState =TIM_OutputState_Enable; TIM_OCInitStruct.TIM_OCPolarity =TIM_OCPolarity_High; TIM_OCInitStruct.TIM_Pulse = 1; TIM_OC1Init(TIM3,&TIM_OCInitStruct); TIM_Cmd(TIM3,DISABLE);//
先不使能 //TIM2 TIM_TimeBaseInitStruct.TIM_ClockDivision =TIM_CKD_DIV1; TIM_TimeBaseInitStruct.TIM_CounterMode =TIM_CounterMode_Up; TIM_TimeBaseInitStruct.TIM_Prescaler = 720; TIM_TimeBaseInitStruct.TIM_Period = TIM2per; TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct); TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Gated);//
门控模式,高电平使能 TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_Enable);//
主从模式使能 TIM_SelectInputTrigger(TIM2,TIM_TS_ITR2);//
选择触发源 TIM_OCInitStruct.TIM_OCMode =TIM_OCMode_PWM2; TIM_OCInitStruct.TIM_OutputState =TIM_OutputState_Enable; TIM_OCInitStruct.TIM_OCPolarity =TIM_OCPolarity_High; TIM_OCInitStruct.TIM_Pulse = TIM2Compare1;//
比较捕获的预装载值 TIM_OC3Init(TIM2,&TIM_OCInitStruct); TIM_Cmd(TIM2,ENABLE); } voidTIM2_TIM3_PWM(u16 Cycle, u16 Pulse_Num) //Cycle
周期,Pulse_Num
脉冲个数 { u16 TIM2per = 0; u32 Time = 0; Time = Cycle * Pulse_Num; Time /= 100; //
预分频7200
,100us
计数一次 TIM2per = Cycle/10; //
预分频720
,10us
计数一次 TIM_SetAutoreload(TIM3, Time+1); //
设置TIM3
重装值 TIM_SetAutoreload(TIM2, TIM2per-1); //
设置TIM2
重装值 TIM_SetCompare1(TIM2,TIM2per/2); //
设置占空比50% TIM_Cmd(TIM3,ENABLE); //
使能 }
谢谢。
已经实验过了,依然没有波形。
一周热门 更多>