本帖最后由 nashui_sx 于 2019-7-15 09:06 编辑
修正一个错误,输出比较的时候,两个定时器共用CH1_Flag造成干扰,前面分别加上定时器标记 TIM1_CH1_Flag,别的还未发现错误,已经重新上传
//每个功能都在
stm32f103zet6上测试通过
// 1普通定时 2输入捕获 3输出比较 4PWM 5单脉冲输出
//TIMx_Time_Init TIMx_InputCapture_Init TIMx_OutputCompare_Init TIMx_Pwm_Init TIMx_OnePulseOutput_Init
//基本定时器TIM6,7只有1定时的功能,剩余的4个功能分别用高级TIM1 通用TIM2进行测试,便于大家移植
在time.h 中切换功能
#define TIMx_Time_Init_Test 0
#define TIMx_InputCapture_Init_Test 0
#define TIMx_OutputCompare_Init_Test 0
#define TIMx_Pwm_Init_Test 0
#define TIMx_OnePulseOutput_Init_Test 0
定时器5种模式实验.rar
(314.4 KB, 下载次数: 1166)
4 天前 上传
点击文件名下载附件
具体细节参考程序内部说明
例如输出比较可以产生特殊波形
增加两个定时器功能:6标志量触发单脉冲输出 7定时器主从模式产生准确脉冲个数
添加2功能 定时器5种模式实验.rar
(315.12 KB, 下载次数: 1104)
4 天前 上传
点击文件名下载附件
1普通定时 : 基本定时
2输入捕获 :一个通道捕获高电平,测量占空比,一个通道测量两个上升沿间隔测量周期
3输出比较 :一个定时器可以产生4中周期不同占空比的pwm,还可以翻转任意io实现任意引脚输出pwm
(还可以实现一个定时器实现4种基本定时,大家自己扩展吧)
4PWM :一个定时器产生一种周期的4种占空比pwm
5单脉冲输出:通道2检测到上升沿后,通道1延时设定时间后输出一个设定时间的高电平脉冲
6标志量触发单脉冲输出
7定时器主从模式产生准确脉冲个数
8 TIM计数模式c8t6做的
TIM 计数模式.rar
(3.28 MB, 下载次数: 675)
2017-12-5 20:12 上传
点击文件名下载附件
TIM1在43楼
单脉冲输出的现象:
这个对应端口,为啥还要右移才提示有这个信号,不然都添加不了这个端口
STM32F103C8t6的板子
TIM1_Cap_Init(0xffff,72-1); //òÔ1MhzμÄÆμÂê¼Æêy
void TIM1_Cap_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_ICInitTypeDef TIM1_ICInitStructure;//
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //ê1ÄüTIM1ê±Öó
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //ê1ÄüGPIOBê±Öó
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PA10 Çå3y֮ǰéèÖÃ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD ; //PA10 êäèë
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_10); //PA10 ÏÂà-
//3õê¼»ˉ¶¨ê±Æ÷1 TIM1
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);//éèÖÃè±ê¡Öμ,Õaò»2½×îoüóéÏ
TIM_TimeBaseStructure.TIM_Period = arr; //é趨¼ÆêyÆ÷×Ô¶ˉÖØ×°Öμ
TIM_TimeBaseStructure.TIM_Prescaler =psc; //Ô¤·ÖÆμÆ÷
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //éèÖÃê±Öó·Ö¸î:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIMÏòéϼÆêyÄ£ê½
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;//éèÖÃÖظ′òç3ö′Îêy£¬¾íêǶàéù′Îòç3öoó½øèëÖD¶Ï£¬ò»°ãÎa0£¬Ö»óD¸ß¼¶¶¨ê±Æ÷2ÅóDóÃ
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //¸ù¾YTIM_TimeBaseInitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉTIMxμÄê±¼ä»ùêyμ¥λ
//3õê¼»ˉTIM1êäèë2¶»ñ2Îêy
TIM_ICStructInit(&TIM1_ICInitStructure);//éèÖÃè±ê¡Öμ,Õaò»2½×îoüóéÏ
TIM1_ICInitStructure.TIM_Channel = TIM_Channel_3; //CC2S=01 Ñ¡Ôñêäèë¶Ë IC1ó3éäμ½TI1éÏ //TIM1_CH2 pB14
TIM1_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //éÏéyÑØ2¶»ñ
TIM1_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //ó3éäμ½TI2éÏ
TIM1_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV8 ; //ÅäÖÃêäèë·ÖÆμ,2»·ÖÆμ
TIM1_ICInitStructure.TIM_ICFilter = 0x00; //IC1F=0000 ÅäÖÃêäèëÂË2¨Æ÷ 2»ÂË2¨
TIM_ICInit(TIM1, &TIM1_ICInitStructure);
//ÖD¶Ï·Ö×é3õê¼»ˉ
NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn; //TIM1ÖD¶Ï
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =2; //ÏèÕ¼óÅÏ輶2¼¶
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //′óóÅÏ輶0¼¶
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQí¨μà±»ê1Äü
NVIC_Init(&NVIC_InitStructure); //¸ù¾YNVIC_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèNVIC¼Ä′æÆ÷
TIM_ITConfig(TIM1,TIM_IT_Update|TIM_IT_CC3,ENABLE);//ÔêDí¸üDÂÖD¶Ï ,ÔêDíCC1IE2¶»ñÖD¶Ï
// TIM_CtrlPWMOutputs(TIM1,ENABLE); //Ö÷êä3öê1Äü
TIM_Cmd(TIM1,ENABLE ); //ê1Äü¶¨ê±Æ÷1
}
u8 TIM1CH3_CAPTURE_STA=0; //êäèë2¶»ñ×′ì¬
u16 TIM1CH3_CAPTURE_VAL; //êäèë2¶»ñÖμ
long long temp=0;
u32 freq_gate=10000;
u8 FLAG = 0;
void TIM1_CC_IRQHandler(void)
{
if((TIM1CH3_CAPTURE_STA&0X80)==0)//»1Î′3é1|2¶»ñ
{
if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)
{
if(TIM1CH3_CAPTURE_STA&0X40)//òѾ-2¶»ñμ½¸ßμçƽáË
{
if((TIM1CH3_CAPTURE_STA&0X3F)==0X3f)//¸ßμçƽì«3¤áË
{
TIM1CH3_CAPTURE_STA=0X80;//±ê¼Ç3é1|2¶»ñáËò»′Î
TIM1CH3_CAPTURE_VAL=0;
}
else TIM1CH3_CAPTURE_STA++;
}
}
if (TIM_GetITStatus(TIM1, TIM_IT_CC3) != RESET)//2¶»ñ1·¢éú2¶»ñê¼t
{
if(TIM1CH3_CAPTURE_STA&0X40) //2¶μú¶t′λñμ½éÏéyÑØ
{
TIM1CH3_CAPTURE_STA|=0X80; //±ê¼Ç3é1|2¶»ñμ½ò»′θßμçƽÂö¿í
TIM1CH3_CAPTURE_VAL=TIM_GetCapture3(TIM1);//»ñè¡μ±Ç°μÄ2¶»ñÖμ.
temp=TIM1CH3_CAPTURE_STA&0X3F;
temp=temp*0XFFFF;
temp=temp+TIM1CH3_CAPTURE_VAL;
if(temp<freq_gate)
FLAG=0;
else
FLAG=1;
}
else //μúò»′Î2¶»ñéÏéyÑØ
{
// ReadValue1=TIM_GetCapture1(TIM1);
TIM1CH3_CAPTURE_STA=0; //Çå¿Õ
TIM1CH3_CAPTURE_VAL=0;
TIM1CH3_CAPTURE_STA |= 0X40; //±ê¼Ç2¶»ñμ½áËéÏéyÑØ
TIM_Cmd(TIM1,DISABLE ); //1رն¨ê±Æ÷2
TIM_SetCounter(TIM1,0);
//TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //CC1P=1 éèÖÃÎaϽμÑØ2¶»ñ
TIM_Cmd(TIM1,ENABLE ); //ê1Äü¶¨ê±Æ÷2
}
}
}
TIM_ClearITPendingBit(TIM1, TIM_IT_CC3|TIM_IT_Update); //Çå3yÖD¶Ï±ê־λ
}
大神可以帮我看一下吗,以1MHZ计数,频率算出来的跟我输入的不一样,我调试了很多次,结果变来变去,不稳定,可以帮我看那一下吗,谢谢!
我要测得频率范围在1Khz之内,这个时钟是72MHz,以1MHZ计算,频率采的不对,我的配置算对吗,对于TIM1
对了你为啥非要用PA10,这个引脚是串口1呀,你是不是串口1 干扰了,用PA8 PA11吧
我准备换TIM2,但是需要重新映像,您再看我一眼我的映像对吗,谢谢!
,
一周热门 更多>