|
虽然使用108MH主频的单片机做一个定时器,有点 大才小用了,但是小小的作品也用到了定时器、ADC、中断和GPIO等模块。作品原理主要是使用三轴加速度传感器采集角度信息并转化为需要的定时时间,同时使用它采集动作信息,作为定时器控制信号。
1.开发环境:
开发工具使用的是True STUDIO,基于ARM GCC的集成开发环境。这个适用于STM32的开发环境同样可以用于GD32F350的开发,但是需要自己修改连接文件,貌似启动文件就不需要修改了。
2.软件流程:
软件的流程是ADC采集三轴加速度的加速度值,依据Z轴的加速变换情况判断是否有动作发生,用来启动或是复位定时器。同时使用XY轴的加速度值计算加速度传感器的倾斜角度,根据倾斜角度计确认定时时间。定时时间到时,蜂鸣器发出蜂鸣声提醒。
3.使用方法:
如果用手在Z轴方向晃动加速度传感器,则计时器复位或重新开始。主要难度是使用加速度传感器的动作检测,这里没有使用复杂的算法,使用了ADC模拟看门狗的功能,动作识别效果一般。
4.作品总结:
作品优点,无按键使用,只要摇晃定时器就可以启动或停止定时器;缺点:没有计时显示功能,后期可以考虑增加显示屏。
5.主函数源代码:
主函数如下,文末附上源文件,
int main(void) {
/* system clocks configuration */
rcu_config();
nvic_config();
/* systick configuration */
systick_config();
/* GPIO configuration */
gpio_config();
/* DMA configuration */
dma_config();
/* ADC configuration */
adc_config();
/*initial other devices*/
timer_config();
gpio_config_timer();
gd_eval_com_init(EVAL_COM1);
gd_eval_led_init(LED1);
gd_eval_led_init(LED2);
gd_eval_led_init(LED3);
gd_eval_led_init(LED4);
gd_eval_led_init(LED5);
Led_demo();
dis_frequency();
cpu_id();
delay_1ms(5000);
p_func = alarm_msg;
timer_enable(TIMER1);
while (1) {
ap_counter++;
alarm_status1 = 3;
alarm_status2 = 0;
alarm_status0 = alarm_run(alarm_msg);
data = 0;
adc_interrupt_enable(ADC_INT_WDE);
// delay_1ms(10);
switch (ap_status) {
case 0:
if (1 == data) {
ap_status = 1;
}
break;
case 1:
if (ap_counter % 1000 == 0) {
delay_1ms(10);
if (0 == data) {
ap_status = 2;
printf("!!\r\n");
} else {
ap_status = 0;
}
}
break;
case 2:
alarm_status2 = 1;
ap_status = 0;
break;
default:
break;
}
adc_disp();
if (alarm_status0 == 1 && alarm_status2 == 1) {
alarm_status1 = 1;
} else if (alarm_status0 == 0 && alarm_status2 == 1) {
alarm_status1 = 0;
}
switch (alarm_status1) {
case 1:
alarm_reset();
printf("Alarm_reset.\r\n");
break;
case 0:
gd_eval_led_off(LED4);
delay_1ms(200);
gd_eval_led_on(LED4);
g_dmacomplete_flag = 0;
delay_1ms(1000);
while (g_dmacomplete_flag != 1)
;
alarm_init(get_angle() * 60000 / 6);
alarm_start();
printf("Alarm start.\r\n");
break;
default:
break;
}
if (alarm_status0) {
printf("Counter: %d minutes\r\n",
(int) alarm_get_counter() / 60000);
}
}
}
6.系统框图如下:
演示视频:视频
补充内容 (2018-10-1 05:36):
后面增加了oled屏显示功能。
|
|