안녕하세요.
오늘은 인피니언 MCU를 이용하여 수동부저를 동작시키는 방법을 정리해 보도록 하겠습니다.
먼저 수동 부저란 무엇을 의미하는 것일까요?
먼저 부저에 대해서
부저는 능동부저와 수동부저로 나눌수 있습니다.
능동부저는 안에 음향 회로가 내장되어 있습니다.
따라서 전원만 인가하면 소리가 나도록 되어져 있습니다.
하지만 하나의 음만 나게 됩니다.
이에 반하여, 수동부저는 따로 음향회로가 없고
PWM 주파수로 제어를 하게 됩니다.
Duty 50%로 Period만 변경을 하여 다양한 음을 낼수가 있습니다.
옥타브 5에서
도 : 523Hz
레 : 587Hz
미 : 659Hz
파 : 699Hz
솔 : 784Hz
입니다.
아래는 옥타브와 음정에 따른 주파수를 나타내고 있습니다.
그렇다면 지금부터 MCU의 PWM을 하나 만들어서, 동작시켜 보도록 하겠습니다.
위에서 p10.4번 포트를 PWM으로 만들어 보도록 하겠습니다.
static void GtmTom0Init(void)
{
IfxGtm_PinMap_setTomTout(&IfxGtm_TOM0_6_TOUT106_P10_4_OUT, IfxPort_OutputMode_pushPull, IfxPort_PadDriver_cmosAutomotiveSpeed4); /*Passive Buzzer*/
GTM_TOM0_CH6_CTRL.B.RST_CCU0 = 0u;
GTM_TOM0_CH6_CTRL.B.TRIGOUT = 1u;
GTM_TOM0_CH6_CTRL.B.SL = 1u;
GTM_TOM0_TGC0_GLB_CTRL.U = 0x20000000u;
GTM_TOM0_TGC0_ENDIS_CTRL.U = 0x2000u;
GTM_TOM0_TGC0_OUTEN_CTRL.U = 0x2000u;
GTM_TOM0_CH6_CTRL.B.CLK_SRC_SR = IfxGtm_Tom_Ch_ClkSrc_cmuFxclk2;
GTM_TOM0_TGC0_GLB_CTRL.B.HOST_TRIG = 1u;
}
초기화는 위와 같습니다.
이제, 주파수를 마음껏 변경할수 있는 API를 만들어 보도록 하겠습니다.
void DrvGtmBuzzerPwm(float32_t param_Ch6Freq)
{
float32_t fPeriodCnt = TOM_BASE_FREQ/param_Ch6Freq;
uint32_t ulPeriodCnt = (uint32_t)fPeriodCnt;
GTM_TOM0_TGC0_GLB_CTRL.U = 0x10000000u;
GTM_TOM0_CH6_SR0.B.SR0 = ulPeriodCnt;
GTM_TOM0_CH6_SR1.B.SR1 = (uint32_t)(fPeriodCnt*0.8f);
GTM_TOM0_TGC0_GLB_CTRL.U = 0x20000000u;
}
Duty는 80%로 만들었습니다.
좋습니다.
아래 코드에서 fBuzzerFreqTemp는 삭제하고 바로 fBuzzerFreq 배열값을 넣으시는것이 좋을것 같습니다.
불필요하네요 ㅎㅎ
참고로 저는 연주를 하나 하려고 합니다.
도,레,미,파,솔에 따른 주파수를 배열에넣었고
제가 컴퓨터로 키보드를 입력하면 무선으로 자동차의 MCU로 정보를 전달하여
부저를 울리려고 합니다.
void Unit_BuzzerControl(void)
{
float32_t fBuzzerFreq[5] = {523.0f, 587.0f, 659.0f, 699.0f, 784.0f};
float32_t fBuzzerFreqTemp = 0.0f;
if(gu32nuAscRxData == 'y')
{
fBuzzerFreqTemp = fBuzzerFreq[0];
DrvGtmBuzzerPwm(fBuzzerFreqTemp);
}
else if(gu32nuAscRxData == 'u')
{
fBuzzerFreqTemp = fBuzzerFreq[1];
DrvGtmBuzzerPwm(fBuzzerFreqTemp);
}
else if(gu32nuAscRxData == 'i')
{
fBuzzerFreqTemp = fBuzzerFreq[2];
DrvGtmBuzzerPwm(fBuzzerFreqTemp);
}
else if(gu32nuAscRxData == 'o')
{
fBuzzerFreqTemp = fBuzzerFreq[3];
DrvGtmBuzzerPwm(fBuzzerFreqTemp);
}
else if(gu32nuAscRxData == 'p')
{
fBuzzerFreqTemp = fBuzzerFreq[4];
DrvGtmBuzzerPwm(fBuzzerFreqTemp);
}
else
{
/*No Code*/
}
}
그러면 이제 연주를 한번 해보도록 하겠습니다.
현재 PWM High Level 전압이 3.3V이기 때문에
소리가 작습니다.
5V면 조금더 클텐데,,,
그래서 동영상을 보실때는 조금 소리를 크게 틀어놔주세요.
그렇다면 이제 PWM에서 도를 내보낼때,
주파수를 한번 Logic Analzer를 통해서 찍어 보도록 하겠습니다.
도 : 523Hz
레 : 587Hz
위와 같이 주파수가 잘 가변되는 것을 확인하실 수 있습니다.
그리고, 주파수를 통해서 부저의 다양한 소리를 제어하고 있음을 확인할수 있습니다.
그런데, 자동차에 달기에는 소리가 너무 적어서 달기가 애매하네요.
나중에 장애물을 감지하거나 위험상황을 감지할때
삐 하고 크게 울리면 좋을것 같은데
우선 넘어가도록 하겠습니다.
오늘 포스팅은 이것으로 마무리할게요.
감사합니다.
'Embedded SW > [Infineon] TC275 Lite Project' 카테고리의 다른 글
초음파 센서와 적외선 센서를 이용하 장애물 감지 (인피니언 TC275) (0) | 2021.12.25 |
---|---|
초음파 센서 원리, 자동차 장착 및 동작 확인 (인피니언 MCU) (0) | 2021.12.24 |
적외선 센서를 이용한 장애물 탐지 차량 주행 (TC275 MCU) (1) | 2021.12.21 |
ADC를 이용하여 GP2Y0A21YK 적외선 센서 거리 측정 (TC275 MCU) (0) | 2021.12.18 |
ADC 설명 정리 및 인피니언 MCU ADC 설계 요소 정리 (1) | 2021.12.02 |
댓글