找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2386|回復: 0
打印 上一主題 下一主題
收起左側

stm32中斷產生ev1527編碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:279326 發(fā)表于 2019-7-10 14:13 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
利用tim3生成ev1527編碼(270K,1200us)
TIM3_PWM_Init(1199,71);        //分頻后1us,窄脈沖4LCK,寬脈沖12LCK,脈沖周期16LCK;同步周期128LCK(4LCK脈沖,124LCK空白);待生成脈沖周期為1200us
//通過改變TIM3->CCR2的值來改變占空比
#define LED0_PWM_DUTY TIM3->CCR2
#define PULSE_CODE    0xD2F672
unsigned int pulse_count=0;
void TIM3_PWM_Init(u16 arr,u16 psc)
{                                          
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  //①使能定時器 3時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|  
RCC_APB2Periph_AFIO, ENABLE);            //①使能 GPIO AFIO 復用功能時鐘
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE); //②重映射 TIM3_CH2->PB5     
//設置該引腳為復用輸出功能,輸出 TIM3 CH2 PWM 脈沖波形 GPIOB.5
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_5;             //TIM_CH2
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;    //復用推挽輸出
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);               //①初始化 GPIO
  
//初始化 TIM3
TIM_TimeBaseStructure.TIM_Period =arr;            //設置在自動重裝載周期值
TIM_TimeBaseStructure.TIM_Prescaler=psc;          //設置預分頻值
TIM_TimeBaseStructure.TIM_ClockDivision =0; //設置時鐘分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up; //TIM 向上計數(shù)模式
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);   //③初始化 TIMx
//初始化 TIM3 Channel2 PWM模式   
TIM_OCInitStructure.TIM_OCMode =TIM_OCMode_PWM1;     //選擇 PWM 模式 1
TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Enable; //比較輸出使能
TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High;  //輸出極性高
TIM_OCInitStructure.TIM_Pulse    = 1200;   
TIM_OC2Init(TIM3,&TIM_OCInitStructure);                //④初始化外設 TIM3 OC2
TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);  //使能預裝載寄存器
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;   
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;   
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;           
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;              
NVIC_Init(&NVIC_InitStructure);
         TIM_ClearFlag(TIM3,TIM_IT_Update);
TIM_ITConfig(TIM3,TIM_IT_Update, ENABLE);
TIM_Cmd(TIM3, ENABLE);                          //⑤使能 TIM3
}  
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)
  {
                   TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
                   if(pulse_count<24)  //編碼部分
                   {
                            if(PULSE_CODE&(1<<(23-pulse_count))) //按位判斷PULSE_CODE的二進制從前面開始,如果當前位==1,寬脈沖900,==,窄脈沖300
                            {
                               LED0_PWM_DUTY = 900;
                               pulse_count++;
                            }
                            else
                            {
                                     LED0_PWM_DUTY= 300;
                               pulse_count++;
                            }
                   }
                   elseif(pulse_count == 24) //同步頭
                   {
                            LED0_PWM_DUTY= 300;
                            pulse_count++;
                   }
                   elseif(pulse_count<31) //同步低電平部分
                   {
                            LED0_PWM_DUTY= 0;
                            pulse_count++;
                   }
                   else
                   {
                            LED0_PWM_DUTY= 0;
                            pulse_count= 0;
                   }
                  
         }
         
}

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表