打印
[其他ST产品]

stm32 输入捕获

[复制链接]
175|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
呈兴|  楼主 | 2023-6-28 16:34 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

根据定时器的计数频率,我们就可以算出t1-t2的时间,从而得到高电平脉宽

计算公式

N * ARR + CCRx2
1
首先设置定时器通道为上升沿捕获,这样在t1时刻,就会捕获到当前的CNT值,然后立即清零CNT,并设置定时器通道为下降沿捕获,这样到t2时刻,又会发生捕获事件,得到此时的CNT值,记为CCRx2


定时器复用功能重映射



使用特权

评论回复
沙发
呈兴|  楼主 | 2023-6-28 16:35 | 只看该作者
输入捕获配置步骤

1.使能定时器时钟
2.使能GPIO时钟,配置引脚模式
3.初始化定时器参数,预分频器的值、自动重装载的值等设定
4.设置通用定时器的输入捕获参数,开启输入捕获功能
5.开启捕获和定时器溢出中断
6.初始化NVIC外设,设置定时器中断优先级
7.使能定时器
8.编写定时器中断处理函数

使用特权

评论回复
板凳
呈兴|  楼主 | 2023-6-28 16:36 | 只看该作者
举例
typedef struct
{
        uint16_t TIM_Channel; //通道
        uint16_t TIM_ICPolarity; //捕获极性
        uint16_t TIM_ICSelection; //直接/间接映射
        uint16_t TIM_ICPrescaler; //分频因子
        uint16_t TIM_ICFilter; //滤波
} TIM_ICInitTypeDef;

#define ICPolarity_Rising        0x40
#define ICPolarity_Falling        0x80
#define Capture1_Max                0x3f

void TIM5_IRQHandler()
{
        if(TIM_GetITStatus(TIM5, TIM_IT_Update) == SET) //产生更新中断
        {
                if((TIM_sta & ICPolarity_Falling) == ICPolarity_Falling) //低电平捕获中
                {
                        if((TIM_sta & Capture1_Max) == Capture1_Max) //达到计数值上限
                        {
                                TIM_sta = ICPolarity_Falling;
                        }
                        else
                        {
                                TIM_sta++; //更新次数
                        }
                }
        }

        if(TIM_GetITStatus(TIM5, TIM_IT_CC1) == SET)
        {
                if((TIM_sta & ICPolarity_Falling) == ICPolarity_Falling) //捕获到低电平
                {
                        TIM_sta |= ICPolarity_Rising;
                        Capture1_val = TIM_GetCapture1(TIM5); //保存捕获值
                        TIM_OC1PolarityConfig(TIM5, TIM_ICPolarity_Rising); //设置上升沿捕获
                }
                else
                {
                        TIM_sta = ICPolarity_Falling;
                        TIM_Cmd(TIM5, DISABLE);
                        TIM_OC1PolarityConfig(TIM5, TIM_ICPolarity_Falling); //设置下降沿捕获
                        TIM_SetCounter(TIM5, 0); //计数器值清零
                        TIM_Cmd(TIM5, ENABLE);
                }       
        }
       
        TIM_ClearITPendingBit(TIM5, TIM_IT_Update | TIM_IT_CC1);
}

void KEY_TIM5_init(u16 period, u16 prescaler)
{
        TIM_TimeBaseInitTypeDef tim_tb = {0};
        TIM_ICInitTypeDef tim_ic =
        {
                TIM_Channel_1, //通道1
                TIM_ICPolarity_Rising, //上升沿
                TIM_ICSelection_DirectTI, //直接映射
                TIM_ICPSC_DIV1, //1分频
                0
        };
        NVIC_InitTypeDef nvic =
        {
                TIM5_IRQn,
                2,
                2,
                ENABLE
        };
        GPIO_InitTypeDef gpio =
        {
                GPIO_Pin_0,
                GPIO_Speed_50MHz,
                GPIO_Mode_IPD //下拉输入模式
        };

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //使能定时器时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

        GPIO_Init(GPIOA, &gpio);
       
        tim_tb.TIM_Prescaler = prescaler;
        tim_tb.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
        tim_tb.TIM_Period = period;
        tim_tb.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseInit(TIM5, &tim_tb); //初始化定时器

        TIM_ICInit(TIM5, &tim_ic); //设置通用定时器的输入捕获参数

        TIM_ITConfig(TIM5, TIM_IT_Update | TIM_IT_CC1, ENABLE); //开启捕获和定时器溢出中断

        NVIC_Init(&nvic); //初始化NVIC

        TIM_Cmd(TIM5, ENABLE); //使能定时器
}

int main(void)
{
        KEY_TIM5_init(0xffff, 72 - 1);
        while(1)
        {
                if((TIM_sta & ICPolarity_Rising) == ICPolarity_Rising) //捕获到低电平
                {
                        res_data = TIM_sta & Capture1_Max;
                        res_data *= 0xffff;
                        res_data += Capture1_val;
                        printf("高电平持续时间 %d um.\n", res_data);
                        TIM_sta = 0;
                }
        }
}

使用特权

评论回复
地板
星辰大海不退缩| | 2023-6-29 13:11 | 只看该作者
楼主不是用的HAL库进行的编程吧,标准库现在确实见的少了,对于ST来说

使用特权

评论回复
5
Undshing| | 2023-7-1 23:28 | 只看该作者
用惯了标准库就不想换了

使用特权

评论回复
6
Pulitzer| | 2023-12-30 07:14 | 只看该作者

输入电源电流环路

使用特权

评论回复
7
童雨竹| | 2023-12-30 09:10 | 只看该作者

单片机一般都有内部程序区和数据区

使用特权

评论回复
8
Wordsworth| | 2023-12-30 10:13 | 只看该作者

输入和输出电流环路连接的位置只能是相应的输入 输出电容的接线端

使用特权

评论回复
9
公羊子丹| | 2023-12-30 12:09 | 只看该作者

CPLD解密,DSP解密都习惯称为单片机解密

使用特权

评论回复
10
万图| | 2023-12-30 13:12 | 只看该作者

引线越长,它能接收和传送的干扰信号频率就越低

使用特权

评论回复
11
Uriah| | 2023-12-30 14:15 | 只看该作者

输入电压端上测得的值比它实际

使用特权

评论回复
12
帛灿灿| | 2023-12-30 16:11 | 只看该作者

引线的长和宽影响它的电阻和电感量

使用特权

评论回复
13
Bblythe| | 2023-12-30 17:14 | 只看该作者

它们的放置要尽可能靠近

使用特权

评论回复
14
周半梅| | 2023-12-30 19:10 | 只看该作者

大部分单片机都带有加密锁定位或者加密字节

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

131

帖子

0

粉丝