您的位置:網站首頁 > 電器維修資料網 > 正文 >
STM32:用定時器實現熒火蟲燈
來源: 日期:2013-12-5 10:33:19 人氣:標簽:
void RCC_Configuration(void)
中的:
RCC_APB2PeriphCLOCkCmd(RCC_APB2Periph_GPIOC, ENABLE); //打開GPIOC的時鐘
改為
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //打開GPIOD的時鐘
(2) 將四個通道全部設置為TIM_OCMode_Toggle模式,即將
/* Output Compare Timing Mode configuration: Channel1 *
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
改為:
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
(3)例子中原來中斷產生的頻率很低,是不適合于做這種熒火蟲燈的,但為了比較,我只改了 后一個值:
__IO uint16_t CCR4_Val = 8192;改為
__IO uint16_t CCR4_Val = 2048;
這樣,這個通道的中斷頻率變為
CC4 update rate = TIM2 counter clock / CCR4_Val = 3515.6 Hz
(4) 到stm32f10x_it.c中作修改中斷處理函數如下:
uint8_t allCount=16;
uint8_t upDown1,upDown2,upDown3,upDown4;
void TIM2_IRQHandler(void)
{ statIC uint8_t Count1,Count2,Count3,Count4;
static uint8_t hCnt1,hCnt2,hCnt3,hCnt4;
if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
if(Count1《hCnt1)
{ GPIO_SetBits(GPIOD, GPIO_PIN_8); //點亮燈
}
else
{ GPIO_ResetBits(GPIOD, GPIO_Pin_8); //熄滅燈
}
Count1++;
if(Count1》=allCount)
{ Count1=0;
if(upDown1)
{ hCnt1++;
if(hCnt1》=(allCount-1))
upDown1=!upDown1;
}
else
{ hCnt1--;
if(hCnt1《2)
upDown1=!upDown1;
}
}
capture = TIM_GetCapture1(TIM2);
TIM_SetCompare1(TIM2, capture + CCR1_Val);
}
else if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
if(Count2《hCnt2)
{ GPIO_SetBits(GPIOD, GPIO_Pin_9); //點亮燈
}
else
{ GPIO_ResetBits(GPIOD, GPIO_Pin_9); //熄滅燈
}
Count2++;
if(Count2》=allCount)
{ Count2=0;
if(upDown2)
{ hCnt2++;
if(hCnt2》=(allCount-1))
upDown2=!upDown2;
}
else
{ hCnt2--;
if(hCnt2《2)
upDown1=!upDown1;
}
}
capture = TIM_GetCapture2(TIM2);
TIM_SetCompare2(TIM2, capture + CCR2_Val);
}
else if (TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);
if(Count3《hCnt3)
{ GPIO_SetBits(GPIOD, GPIO_Pin_10); //點亮燈
}
else
{ GPIO_ResetBits(GPIOD, GPIO_Pin_10); //熄滅燈
}
Count3++;
if(Count3》=allCount)
{ Count3=0;
if(upDown3)
{ hCnt3++;
if(hCnt3》=(allCount-1))
upDown3=!upDown3;
}
else
{ hCnt3--;
if(hCnt3《2)
upDown3=!upDown3;
}
}
capture = TIM_GetCapture3(TIM2);
TIM_SetCompare3(TIM2, capture + CCR3_Val);
}
else
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC4);
if(Count4《hCnt4)
{ GPIO_SetBits(GPIOD, GPIO_Pin_11); //點亮燈
}
else
{ GPIO_ResetBits(GPIOD, GPIO_Pin_11); //熄滅燈
}
Count4++;
if(Count4》=allCount)
{ Count4=0;
if(upDown4)
{ hCnt4++;
if(hCnt4》=(allCount-1))
upDown4=!upDown4;
}
else
{ hCnt4--;
if(hCnt4《2)
upDown4=!upDown4;
}
}
capture = TIM_GetCapture4(TIM2);
TIM_SetCompare4(TIM2, capture + CCR4_Val);
}
}
即將LED點亮的過程分成16(allCount)份,第一次是點亮1/16時間,而15/16的時間都是滅著的,這個1是變量hCnt來控制的,隨著中斷16次完畢,hCnt會加1,于是第二個周期來了,在這個周期中,LED會被點亮2/16,而14/16的時間是滅著的,依次類推,到 后會有 15/16的時間被點亮,而1/16的時間是滅著的,于是就產生了漸亮效果。請原諒我在學習時的代碼寫得很粗糙了。
由于TIM2_CH1通道的中斷頻率是:
CC1 update rate = TIM2 counter clock / CCR1_Val = 146.48 Hz
再除以16那就是:9.1Hz,閃爍現像應該很明顯了。
將代碼寫入芯片,事實確實是TIM2_CH1(146.48Hz)和TIM2_CH2(219.7Hz)的閃爍極明顯,幾乎看不出漸亮的過程,亮度高時幾乎全亮,亮度低時一陣狂閃。而TIM2_CH4則效果十分明顯,達到了預計的要求。TIM2_CH3(439.4)呢,則介于兩者之間,可以看出漸亮和漸滅的效果,但是也有很明顯的閃爍效應。但在示波器(傳統示波器)上,卻是TIM2_CH3的效果 好,逐漸伸縮的PWM波形看得清清楚楚。
【看看這篇文章在百度的收錄情況】
相關文章
- 上一篇: STM32:玩玩修改串口
- 下一篇: 視頻監控系統的構成與發展