|
GD32E231 DIY大赛(7)——人体红外传感模块及音乐IC驱动完成
[复制链接]
本帖最后由 hujj 于 2019-5-13 18:50 编辑
经过几天的折腾,终于将人体红外传感模块及音乐IC成功地驱动了。下图是测试过程:
这是人体红外传感模块的正面:
人体红外传感模块是网上购买的成品(见下图),它有三个引脚,分别为VCC、OUT、GND,当传感器接收信息时输出高电平,我将其接在PA5引脚上,同时开启中断,下图是从网上截图模块的特写:
下面是中断配置的代码:
void exti_config(void)
{
/* enable the clock 使能时钟*/
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_CFGCMP);
/* configure GPIO as input 配置GPIO为输入*/
gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_5);
/* enable and set EXTI interrupt 启用并设置exti中断*/
nvic_irq_enable(EXTI4_15_IRQn, 1U);
/* connect EXTI line to GPIO pin */
syscfg_exti_line_config(EXTI_SOURCE_GPIOA, EXTI_SOURCE_PIN5);
/* configure EXTI line */
exti_init(EXTI_5, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
exti_interrupt_flag_clear(EXTI_5);
}
以下是中断处理的代码,我仅仅在中断处理时将mode设置为9,然后在主循环中进行处理:至此,项目的硬件部分基本完成,即将开始软件调试。
void EXTI4_15_IRQHandler(void)
{
if(RESET != exti_interrupt_flag_get(EXTI_5)){
// gd_eval_led_toggle(LED2);
mode = 9; //建立报警标志
}
exti_interrupt_flag_clear(EXTI_5);
}
驱动这个模块没费什么功夫,连线测试一次成功,倒是选择音乐IC费了不少周折。在我的项目中准备用不同的声音来作不同时段的报警,开始打算用多块音乐IC来完成,但测试时发现喇叭共用的效果很差,根本无法接受,若同时使用多个喇叭又太麻烦,最后只好选用了一块四声报警音乐IC(见下图):
下面是焊接在扩展板上的四声报警音乐IC:
这种音乐IC有两个设置键,其中K2是控制发出类似机关枪的哒哒声,我未启用此键。K1分浮空、接高电平和接低电平,浮空时发出警车笛声,接高电平发出消防车笛声,接低电平发出救护车笛声。我通过PA4引脚来控制,浮空时设置引脚为输入浮空状态,高低电平则设置成输出状态再设置引脚电平,经测试取得了不错的效果,下面是设置的代码:
- /*!
- \brief 报警方式设置
- \param[in] type: 0=低电平,1=高电平,2=浮空
- \param[out] none
- \retval none
- */
- void alarm_type(uint8_t type)
- {
- if(type>1){
- gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_NONE,GPIO_PIN_4); //输入模式
- gd_eval_led_on(LED4);
- }
- else{
- gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_4);
- gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_4);
- if(type==0){
- gd_eval_led_on(LED2);
- gpio_bit_reset(GPIOA, GPIO_PIN_4);
- }
- else{
- gd_eval_led_on(LED3);
- gpio_bit_set(GPIOA, GPIO_PIN_4);
- }
- }
- }
复制代码
由于这种音乐IC是通电即响,断电即停,因此需要用一个电子开关来控制,想不到这最简单的三极管开关电路却花费了两天时间。
开始我随便拿了一个3DG201和一个基极限流电阻焊接了一个开关电路,谁知测试没有达到目的,反复更换三极管和基极限流电阻都不行,音乐IC不能正常发声,最后只好仔细分析电路,发现若控制正极时需要用PNP管,控制负极时需要用NPN管,而我用NPN管来控制正极,所以不能成功,最后换了一个9015PNP管,调整好基极限流电阻后才达到要求(参见下图),至此,本项目的硬件部分基本完成,下一步即将开始软件调试工作。
|
|