【MM32】 eMiniBoard 之 PWM驱动无源蜂鸣器+ADC调整LED亮度 参考例程(下)

ADC调整LED亮度

ADC调度算法


void adcTick(void)
{
    adc0  = (u16)((float)(adc0  * 6 + ADCtemp[0] * 4) / 10);
    adc1  = (u16)((float)(adc1  * 6 + ADCtemp[1] * 4) / 10);
    adc2  = (u16)((float)(adc2  * 6 + ADCtemp[2] * 4) / 10);
    if((fabs((u16)ADCtemp[0] - adc0) > 10) ||(fabs((u16)ADCtemp[1] - adc1) > 10) ||(fabs((u16)ADCtemp[2] - adc2) > 10)){
        adcFlag = true;
    }
}

LED调度算法


void ledBlink(void)
{
    closeLED();
    if(sPlayMusic.PlayFlag){
        switch(sPlayMusic.MusicNum){
            case 0:
            (led1++) ? (led1 = 0,LD6_on()) : LD6_off();
            break;
            case 1:
            (led2++) ? (led2 = 0,led2off()) : led2on();
            break;
            case 2:
            (led3++) ? (led3 = 0,led3off()) : led3on();
            break;
            case 3:
            (led4++) ? (led4 = 0,led4off()) : led4on();
            break;
            default:
            break;
        }
    }
}

系统调度


void AppTaskTick(void)
{
    if(ready){
	    //................
	    
	    // LED Tick Handle
        if (ledtick++ >= 400) {
            ledtick  = 0;
            ledBlink();
        }
    }
    if (adcCnt++ >= 50) {
        adcCnt  = 0;
        adcTick();
        if(adcFlag){
            adcFlag = false;
            led2on();led3on();led4on();
        }
    }
}

主程序

包含 PWM 驱动无源蜂鸣器与 ADC 调整 LED 亮度全部代码:


void main()
{
    MCUID = SetSystemClock(emSYSTICK_On, (u32*)&AppTaskTick);
    
    // init LED
    LD4_on();LD6_on();
    while(!delay(450));
    CloseLED();
    while(!delay(120));
    LD3_on();LD5_on();
    while(!delay(450));
    CloseLED();
    while(!delay(120));
    OpenLED();
    while(!delay(450));
    CloseLED();
    while(!delay(250));
    
    // init Buzzer
    RCC_GetClocksFreq(&rcc_clocks);
    initBuzzer(rcc_clocks.SYSCLK_Frequency / 2000000 - 1);
    memset(&sPlayMusic, 0x00, sizeof(sPlayMusic));
    
    // init ADC / Timer
    initADC();
    initLEDPWM(rcc_clocks.SYSCLK_Frequency / 1000000 - 1, 4096);
    
    // defult: music0
    ready = true;
    sPlayMusic.MusicNum = 0;
    sPlayMusic.PlayFlag = true;
    
    while(1){
        if (SysKeyboard(&vkKey)) {
            switch (vkKey) {
                case VK_K0:
                if(sPlayMusic.MusicNum != 0){
                    memset(&sPlayMusic, 0x00, sizeof(sPlayMusic));
                    sPlayMusic.MusicNum = 0;
                    sPlayMusic.PlayFlag = true;
                }
                else if(sPlayMusic.PlayFlag){
                    sPlayMusic.PlayFlag = false;
                    setBuzzerEn(DISABLE);
                }
                else sPlayMusic.PlayFlag = true;
                k0flag = true;break;
                case VK_K1:
                if(sPlayMusic.MusicNum != 1){
                    memset(&sPlayMusic, 0x00, sizeof(sPlayMusic));
                    sPlayMusic.MusicNum = 1;
                    sPlayMusic.PlayFlag = true;
                }
                else if(sPlayMusic.PlayFlag){
                    sPlayMusic.PlayFlag = false;
                    setBuzzerEn(DISABLE);
                }
                else sPlayMusic.PlayFlag = true;
                k1flag = true;break;
                case VK_K2:
                if(sPlayMusic.MusicNum != 2){
                    memset(&sPlayMusic, 0x00, sizeof(sPlayMusic));
                    sPlayMusic.MusicNum = 2;
                    sPlayMusic.PlayFlag = true;
                }
                else if(sPlayMusic.PlayFlag){
                    sPlayMusic.PlayFlag = false;
                    setBuzzerEn(DISABLE);
                }
                else sPlayMusic.PlayFlag = true;
                k2flag = true;break;
                case VK_K3:          
                if(sPlayMusic.MusicNum != 3){
                    memset(&sPlayMusic, 0x00, sizeof(sPlayMusic));
                    sPlayMusic.MusicNum = 3;
                    sPlayMusic.PlayFlag = true;
                }
                else if(sPlayMusic.PlayFlag){
                    sPlayMusic.PlayFlag = false;
                    setBuzzerEn(DISABLE);
                }
                else sPlayMusic.PlayFlag = true;
                k3flag = true;break;
                default: break;
            }
        }
        
        TIM_SetCompare2(TIM2, adc0);
        TIM_SetCompare1(TIM3, adc1);
        TIM_SetCompare2(TIM3, adc2);
    }
}

全局变量


bool ready = false;
bool k0flag,k1flag,k2flag,k3flag;
bool adcFlag = false;
u8 led1,led2,led3,led4;
u16 adcCnt;
u16 ledtick;
u16 adc0,adc1,adc2;
u32 ADCtemp[3];
RCC_ClocksTypeDef rcc_clocks;

typedef enum {
    PLAYSTEP1,
    PLAYSTEP2,
    PLAYSTEP3
} emMusicStep;

typedef struct {
    u8 PlayFlag;
    u8 CurrentPlayFlag; 
    emMusicStep PlayStep;
    s8 MusicNum;
    u16 ToneCount;
    u16 ToneNumCount;
} _sPlayMusic;
_sPlayMusic sPlayMusic;


// MUSIC 0:Lanhua Cao

u8 music[]={
    6,3,3,3,3,2,        1,2,1,27,26,        6,6,6,6,6,5,
    3,5,5,4,3,          3,6,6,5,3,2,        1,2,1,27,26,23,
    23,1,1,27,26,3,     2,1,27,25,26
};

u8 time[] = {
    2,2,2,2,6,2,        3,1,2,2,8,          2,2,2,2,6,2,
    2,2,2,2,8,          2,2,2,2,6,2,        2,2,2,2,4,4,
    2,2,2,2,6,2,        3,1,2,2,8 
};


// MUSIC 1:The song of pig

u8 music1[]={
    6,13,15,            13,6,11,            6,11,6,11,13,
    13,12,13,11,6,      13,15,16,16,        16,13,15,
    13,15,13,15,16,16,  16,13,15,           15,6,15,6,
    13,12,13,11,        12,12,              12,11,12,13,15,
    16,33,              13,33,              13,33,13,33,
    13,12,13,11,        12,12,              12,11,12,13,15,
    16    
};

u8 time1[] = {
    4,3,1,              2,2,4,              1,1,1,1,4,
    1,1,1,1,4,          3,1,2,2,            2,2,4,
    1,1,1,1,2,2,        2,2,4,              2,2,2,2,
    2,1,1,4,            4,4,                2,1,1,2,2,
    4,4,                4,4,                2,2,2,2,
    2,1,1,4,            4,4,                2,1,1,2,2,
    4
};


// MUSIC 2:Happy Birthday

u8 music2[]={
    5,5,6,5,11,7,
    5,5,6,5,12,11,
    5,5,15,13,1,7,6,
    14,14,13,11,12,11
};

u8 time2[] = {
    2,2,4,4,4,8,
    2,2,4,4,4,8,
    2,2,4,4,4,4,4,
    2,2,4,4,4,12
};


// MUSIC 3:Happy New Year

u8 music3[]={
    1,1,1,25,       3,3,3,1,        1,3,5,5,
    4,3,2,          2,3,4,4,        3,2,3,1,
    1,3,2,25,       27,2,1
};

u8 time3[] = {
    2,2,4,4,        2,2,4,4,        2,2,4,4,
    2,2,8,          2,2,4,4,        2,2,4,4,    
    2,2,4,4,        2,2,8
};


// tonetime = 2 000 000 / toneFreq
// toneFreq refer to https://blog.csdn.net/leonliu070602/article/details/76254153

const u16 tonetime[] = {
    1000,
    // 1: do
    7633,   6802,   6060,   5076,   5102,   4545,   4048,1000,1000,1000,
    //11: `do
    3824,   3407,   3034,   2865,   2550,   2273,   2024,1000,1000,1000,
    //21: do`
    15267,  13605,  12121,  11429,  10204,  9090,   8097,1000,1000,1000,
    //31: ``do
    1910,   1702,   1516,   1432,   1276,   1136,   1012,1000,1000,1000,
};

参考文献

[1].【MM32 eMiniBoard测评报告】开发板按键及蜂鸣器评测.[link]
[2].【音阶对应频率表】[link]
[3].【STM32】基于普通定时器TIM3 PWM输出驱动无源蜂鸣器.[link]

其他链接:
1.灵动 官网: MindMotion
2.灵动 GitHub: github
2.灵动 BBS: 21ic.bbs

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值