历史上的今天
返回首页

历史上的今天

今天是:2024年12月29日(星期日)

2018年12月29日 | stm32学习笔记(十)输入捕获实验

2018-12-29 来源:eefocus

#include "timer.h"

#include "led.h"

#include "usart.h"

#include "sys.h"

//////////////////////////////////////////////////////////////////////////////////  

//本程序只供学习使用,未经作者许可,不得用于其它任何用途

//ALIENTEK Mini STM32开发板

//PWM  驱动代码    

//正点原子@ALIENTEK

//技术论坛:www.openedv.com

//修改日期:2010/12/03

//版本:V1.0

//版权所有,盗版必究。

//Copyright(C) 正点原子 2009-2019

//All rights reserved

//////////////////////////////////////////////////////////////////////////////////   

 

//PWM输出初始化

//arr:自动重装值

//psc:时钟预分频数

void TIM1_PWM_Init(u16 arr,u16 psc)

{  

GPIO_InitTypeDef GPIO_InitStructure;

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure; //时基结构体

TIM_OCInitTypeDef  TIM_OCInitStructure;         //输出比较结构体

 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);// TIM1时钟使能,挂载在APB2高速总线上

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  //使能GPIO外设时钟使能

                                                                     

 

   //设置该引脚为复用输出功能,输出TIM1 CH2的PWM脉冲波形

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH2

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO输出频率50MHZ

GPIO_Init(GPIOA, &GPIO_InitStructure);

 


TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 80K

TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频

TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式

TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

 

 

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能

TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高

TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

 

  TIM_CtrlPWMOutputs(TIM1,ENABLE); //MOE 主输出使能

 

TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1预装载使能  


TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器


TIM_Cmd(TIM1, ENABLE);  //使能TIM1

 

   

}

 

//定时器2通道1输入捕获配置

 

TIM_ICInitTypeDef  TIM2_ICInitStructure;

 

void TIM2_Cap_Init(u16 arr,u16 psc)

{  

GPIO_InitTypeDef GPIO_InitStructure;

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

  NVIC_InitTypeDef NVIC_InitStructure;

 

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能TIM2时钟在APB1低速总线上

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA时钟


GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;  //PA0 清除之前设置  

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 输入  下拉输入

GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_ResetBits(GPIOA,GPIO_Pin_0); //PA0 下拉


//初始化定时器2 TIM2  

TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值 

TIM_TimeBaseStructure.TIM_Prescaler =psc; //预分频器   

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

  

//初始化TIM2输入捕获参数

TIM2_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01 选择输入端 IC1映射到TI1上

  TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获

  TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上

  TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频 

  TIM2_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波

  TIM_ICInit(TIM2, &TIM2_ICInitStructure);


//中断分组初始化

NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  //TIM2中断

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //先占优先级2级

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //从优先级0级

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能

NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 


TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允许更新中断 ,允许CC1IE捕获中断


  TIM_Cmd(TIM2,ENABLE ); //使能定时器2

 

}

 

 

u8  TIM2CH1_CAPTURE_STA=0; //输入捕获状态    

u16 TIM2CH1_CAPTURE_VAL; //输入捕获值

 

//定时器5中断服务程序  

void TIM2_IRQHandler(void)

 

  if((TIM2CH1_CAPTURE_STA&0X80)==0)//还未成功捕获

{   

if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)

 

{     

if(TIM2CH1_CAPTURE_STA&0X40)//已经捕获到高电平了

{

if((TIM2CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了

{

TIM2CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次

TIM2CH1_CAPTURE_VAL=0XFFFF;

}else TIM2CH1_CAPTURE_STA++;

}  

}

if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)//捕获1发生捕获事件

{

if(TIM2CH1_CAPTURE_STA&0X40) //捕获到一个下降沿

{  

TIM2CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次上升沿

TIM2CH1_CAPTURE_VAL=TIM_GetCapture1(TIM2);

    TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获

}else  //还未开始,第一次捕获上升沿

{

TIM2CH1_CAPTURE_STA=0; //清空

TIM2CH1_CAPTURE_VAL=0;

TIM_SetCounter(TIM2,0);

TIM2CH1_CAPTURE_STA|=0X40; //标记捕获到了上升沿

    TIM_OC1PolarityConfig(TIM2,TIM_ICPolarity_Falling); //CC1P=1 设置为下降沿捕获

}     

}              

  }

 

    TIM_ClearITPendingBit(TIM2, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位

 

}



#include "led.h"

#include "delay.h"

#include "sys.h"

#include "timer.h"

#include "usart.h"

//ALIENTEK Mini STM32开发板范例代码9

//输入捕获实验   

//技术支持:www.openedv.com

//广州市星翼电子科技有限公司

 

 

extern u8  TIM2CH1_CAPTURE_STA; //输入捕获状态    

extern u16 TIM2CH1_CAPTURE_VAL; //输入捕获值

 int main(void)

 {

 

u32 temp=0; 

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2

delay_init();     //延时函数初始化

uart_init(9600); //9600  

LED_Init();   //初始化与LED连接的硬件接口

  TIM1_PWM_Init(899,0); //不分频。PWM频率=72000/(899+1)=80Khz

  TIM2_Cap_Init(0XFFFF,72-1); //以1Mhz的频率计数 

    while(1)

{

  delay_ms(10);

TIM_SetCompare1(TIM1,TIM_GetCapture1(TIM1)+1);

if(TIM_GetCapture1(TIM1)==300)TIM_SetCompare1(TIM1,0);  

if(TIM2CH1_CAPTURE_STA&0X80)//成功捕获到了一次高电平

{

temp=TIM2CH1_CAPTURE_STA&0X3F;

temp*=65536; //溢出时间总和

temp+=TIM2CH1_CAPTURE_VAL; //得到总的高电平时间

printf("HIGH:%d us\r\n",temp); //打印总的高点平时间

  TIM2CH1_CAPTURE_STA=0; //开启下一次捕获

  }

}

}


推荐阅读

史海拾趣

East Texas Integrated Circuits公司的发展小趣事

East Texas Integrated Circuits公司(ETIC)成立于XX世纪初,最初只是一个由几位电子工程师组成的创业团队。他们的梦想是利用最新的技术研发高性能的集成电路。通过不断的努力,他们成功地研发出了一种新型的低功耗集成电路,这种电路能够在保持高速度的同时降低能源消耗,迅速在市场上获得了认可。

EUCHNER公司的发展小趣事

EUCHNER公司一直将质量和服务视为其生命线。公司严格控制产品质量,所有核心部件均自行生产,以确保产品的可靠性和稳定性。同时,公司还注重客户服务体验,为客户提供具有竞争力的价格及优质服务。无论是为大型汽车制造企业还是小型研究机构提供解决方案,公司都坚持与客户紧密合作并倾听他们的需求。通过持续提升质量和服务水平,EUCHNER公司逐渐赢得了客户的信任和忠诚。

Epistar Corp公司的发展小趣事

面对不断变化的市场需求和行业竞争格局Epistar始终保持创新精神不断探索新的技术方向和应用领域。公司加强与高校和研究机构的合作共同研发新技术、新产品;同时,Epistar还积极参与制定行业标准推动LED行业的健康发展。这些创新举措使Epistar在行业中始终保持领先地位引领着未来LED技术的发展方向。

磁联达(CND-tek)公司的发展小趣事

随着5G技术的快速发展,磁联达(CND-tek)公司意识到无线充电技术将成为未来的重要趋势。公司投入大量资源进行无线充电发射线圈的研发,经过多次试验和改进,终于成功推出了一款性能稳定、效率高的无线充电产品。这一创新不仅为公司带来了丰厚的利润,也进一步巩固了公司在行业内的领先地位。

DL Instruments LLC公司的发展小趣事

DL Instruments继承了Ithaco Corporation在精密仪器制造方面的技术积累,并在此基础上不断创新。公司推出了多种高性能的前置放大器产品,如低噪声电流前置放大器1211型、电流前置放大器1212型等。这些产品以其高阻抗差分或单端输入、共模抑制性能以及能在交流或直流耦合模式下运行的特点,赢得了市场的广泛认可。

驰兴电感(Coilank)公司的发展小趣事

随着电子行业的快速发展,驰兴电感紧跟市场趋势,不断拓展产品应用领域。除了传统的消费电子和通讯领域外,驰兴电感还成功将产品应用于汽车电子、网络通讯、智能家居等新兴领域。这些领域的拓展不仅为公司带来了更广阔的市场空间,也进一步提升了驰兴电感在电子行业中的地位。

问答坊 | AI 解惑

锁相环频率捕捉过程的计算机辅助设计

[摘要〕在对锁相环频率捕捉过程进行数学分析的基础之上,给出了用计算机模拟锁相环频率捕捉过程的基本方法和计算程序。文中对一个具体例子做了模拟,模拟结果与理论分析完全吻合。…

查看全部问答>

实用的4~20mA输入/0~5V输出的I/V转换电路

最简单的4-20mA输入/5V输出的I/V转换电路 在与电流输出的传感器接口的时候,为了把传感器(变送器)输出的1-10mA或者4-20mA电流信号转换成为电压信号,往往都会在后级电路的最前端配置一个I/V转换电路,图1就是这种电路最简单的应用示意图。 ...…

查看全部问答>

wince起来之后,点一下就死机了,帮忙分析一下原因

这是串口打印的信息 RomBOOT>By www.mcuzone.com ...Master Clock is ???????? Hz ?FMD_DirectRead lasted 0 ms for 0x46 bytes (timer granularity is 400) Press [ENTER] to launch image stored in flash or [SPACE] to cancel. Initiating ...…

查看全部问答>

红外通讯问题

麻烦哪位大侠帮忙改善下 把接受到信息(rev)以文本形式保存在text中  万分感激 // IrServerDlg.cpp : implementation file // #include \"stdafx.h\" //#include \"Winsock2.h\" #include \"IrServer.h\" #include \"IrServerDlg. ...…

查看全部问答>

关于放大类题目讨论~

本帖最后由 paulhyde 于 2014-9-15 09:00 编辑 首先~那个电源的话~3.6v~是通过220v还是有提供直流电源转换过去?  …

查看全部问答>

步进电机加减速

2812控制驱动器驱动步进电机,信号脉冲和方向脉冲控制电机,加减速就是改变脉冲频率,谁有加减速的算法程序,现在急用,自己编来不及了!…

查看全部问答>

建议资源下载中心能有“资源预览”功能

建议资源下载中心能有“资源预览”功能,技术上能实现不?…

查看全部问答>

关于2个红外传感器被触发的先后顺序的问题

两个红外传感器被触发的先后顺序怎么来判断?哪位大神来帮帮我啊~ …

查看全部问答>

C2000 RMS计算求指点

简单来说这段代码是用来做FIR+RMS计算的。FIR的部分是直接用TI的例程的。RMS算法部分是自己写了。 AD采集得到数据由CLA读取中断和采样结果,并且进行数字滤波。 RMS算法的部分就是每次滤波完的数据都求一次平方,并且累加。同时设定某一个阀值Vth ...…

查看全部问答>

延时程序怎么写

我要做一个延时关收音机的电路,电路图已有,但是延时程序不知道怎么写(我要延时30分钟) …

查看全部问答>