硬體設計:
脈寬測量原理:
當按鍵沒有按下時,由硬體電路自動拉低。如果按鍵按下,則pa0產生上公升沿,我們進行脈寬測量時,首先設定為上公升沿捕獲,然後在第一次捕獲到上公升沿時,將計數器清零,並設定捕獲極性為下降沿捕獲。當第二次捕獲到訊號時,就是乙個完整的高電平時間。值得注意的是,如果定時器溢位頻率為72m(預分頻係數71)時,最大計數值為65536us,要考慮溢位(更新中斷)。
**如下,非常簡單。
bsp_generaltim.c
#include "bsp_generaltim.h"
// 定時器輸入捕獲使用者自定義變數結構體定義
tim_icuservaluetypedef tim_icuservaluestructure = ;
// 中斷優先順序配置
static void general_tim_nvic_config(void)
static void general_tim_gpio_config(void)
static void general_tim_mode_config(void)
void general_tim_init(void)
bsp_generaltim.h
#ifndef __bsp_advancetim_h
#define __bsp_advancetim_h
#include "stm32f10x.h"
/************通用定時器tim引數定義,只限tim2、3、4、5************/
// 當使用不同的定時器的時候,對應的gpio是不一樣的,這點要注意
// 我們這裡預設使用tim5
#define general_tim tim5
#define general_tim_apbxclock_fun rcc_apb1periphclockcmd
#define general_tim_clk rcc_apb1periph_tim5
#define general_tim_period 0xffff
#define general_tim_psc (72-1)
// tim 輸入捕獲通道gpio相關巨集定義
#define general_tim_ch1_gpio_clk rcc_apb2periph_gpioa
#define general_tim_ch1_port gpioa
#define general_tim_ch1_pin gpio_pin_0
#define general_tim_channel_x tim_channel_1
// 中斷相關巨集定義
#define general_tim_it_ccx tim_it_cc1
#define general_tim_irq tim5_irqn
#define general_tim_int_fun tim5_irqhandler
// 獲取捕獲暫存器值函式巨集定義
#define general_tim_getcapturex_fun tim_getcapture1
// 捕獲訊號極性函式巨集定義
#define general_tim_ocxpolarityconfig_fun tim_oc1polarityconfig
// 測量的起始邊沿
#define general_tim_strat_icpolarity tim_icpolarity_rising
// 測量的結束邊沿
#define general_tim_end_icpolarity tim_icpolarity_falling
// 定時器輸入捕獲使用者自定義變數結構體宣告
typedef struct
tim_icuservaluetypedef;
extern tim_icuservaluetypedef tim_icuservaluestructure;
/**************************函式宣告********************************/
void general_tim_init(void);
#endif /* __bsp_advancetim_h */
以上是一些結構體配置,然後比較重要的是中斷服務函式:
void general_tim_int_fun(void)
// 上公升沿捕獲中斷
if ( tim_getitstatus (general_tim, general_tim_it_ccx ) != reset)
// 下降沿捕獲中斷
else // 第二次捕獲
tim_clearitpendingbit (general_tim,general_tim_it_ccx);
} }
在主函式中進行測試:
main.c
#include "stm32f10x.h"
#include "bsp_led.h"
#include "bsp_usart.h"
#include "bsp_generaltim.h"
#include void delay(uint32_t count);
int main(void)}}
測試結果為:
stm32專題二十六 互補輸出 死區剎車
互補輸出 死區剎車 這一部分 主要是初始化3個結構體,包括時基結構體 輸出比較結構體和死區配置結構體,要對照前一篇部落格和中文參考手冊中的暫存器說明來仔細看,如下 bsp advancetim.c include bsp advancetim.h static void advance tim gp...
stm32 輸入捕獲
根據定時器的計數頻率,我們就可以算出t1 t2的時間,從而得到高電平脈寬 計算公式 n arr ccrx2首先設定定時器通道為上公升沿捕獲,這樣在t1時刻,就會捕獲到當前的cnt值,然後立即清零cnt,並設定定時器通道為下降沿捕獲,這樣到t2時刻,又會發生捕獲事件,得到此時的cnt值,記為ccrx2...
stm32 輸入捕獲
stm32f1 除了基本定時器 tim6 和 tim7,其他定時器都具有輸入捕 獲功能。輸入捕獲可以對輸入的訊號的上公升沿,下降沿或者雙邊沿進行捕獲,通 常用於測量輸入訊號的脈寬 測量 pwm 輸入訊號的頻率及占空比 原理 輸入捕獲模式下,u8 tim5 ch1 capture sta 輸入捕獲狀態...