stm32f103zet6高级,通用,基本定时器功能汇总:1普通定时,2输入捕获,3输出比较,4PWM,5单脉冲模式输出,6标...

2019-07-21 02:22发布

本帖最后由 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 天前 上传 点击文件名下载附件 具体细节参考程序内部说明
例如输出比较可以产生特殊波形
QQ截图20190715083707.jpg
增加两个定时器功能: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楼
单脉冲输出的现象:
1.png



























友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
49条回答
程功之道
1楼-- · 2019-07-25 00:36
564646396 发表于 2017-6-26 10:44
程序上传不了  说太大 什么鬼

这个对应端口,为啥还要右移才提示有这个信号,不然都添加不了这个端口
邦尼power
2楼-- · 2019-07-25 01:52
本帖最后由 邦尼power 于 2018-5-8 10:36 编辑

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                                                                  //μúò&#187;′&#206;2&#182;&#187;&#241;é&#207;éy&#209;&#216;
                                {
//                                        ReadValue1=TIM_GetCapture1(TIM1);
                                        TIM1CH3_CAPTURE_STA=0;                        //&#199;&#229;&#191;&#213;
                                        TIM1CH3_CAPTURE_VAL=0;
                                        TIM1CH3_CAPTURE_STA |= 0X40;                //±ê&#188;&#199;2&#182;&#187;&#241;μ&#189;á&#203;é&#207;éy&#209;&#216;
                                        TIM_Cmd(TIM1,DISABLE );           //1&#216;±&#213;&#182;¨ê±&#198;÷2
                                   TIM_SetCounter(TIM1,0);
                                 //TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling);                //CC1P=1 éè&#214;&#195;&#206;a&#207;&#194;&#189;μ&#209;&#216;2&#182;&#187;&#241;
                                   TIM_Cmd(TIM1,ENABLE );         //ê1&#196;ü&#182;¨ê±&#198;÷2                               
                                }
                        }
                }
          TIM_ClearITPendingBit(TIM1, TIM_IT_CC3|TIM_IT_Update); //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;
}



大神可以帮我看一下吗,以1MHZ计数,频率算出来的跟我输入的不一样,我调试了很多次,结果变来变去,不稳定,可以帮我看那一下吗,谢谢!

275891381
3楼-- · 2019-07-25 07:14
 精彩回答 2  元偷偷看……
邦尼power
4楼-- · 2019-07-25 09:20
本帖最后由 邦尼power 于 2018-5-8 11:46 编辑
275891381 发表于 2018-5-8 11:34
脉冲宽度小于10us左右就不稳定了,你的脉冲多块

我要测得频率范围在1Khz之内,这个时钟是72MHz,以1MHZ计算,频率采的不对,我的配置算对吗,对于TIM1
275891381
5楼-- · 2019-07-25 13:51
邦尼power 发表于 2018-5-8 11:45
我要测得频率范围在1Khz之内,这个时钟是72MHz,以1MHZ计算,频率采的不对,我的配置算对吗,对于TIM1

对了你为啥非要用PA10,这个引脚是串口1呀,你是不是串口1 干扰了,用PA8 PA11吧
邦尼power
6楼-- · 2019-07-25 14:17
275891381 发表于 2018-5-8 11:51
对了你为啥非要用PA10,这个引脚是串口1呀,你是不是串口1 干扰了,用PA8 PA11吧

58.jpg PA8和PA11我做其他它用了,对了,串口1我没用也会干扰呀
我准备换TIM2,但是需要重新映像,您再看我一眼我的映像对吗,谢谢!

重3.jpg

一周热门 更多>