一:遇到的问题
1:上拉下拉问题:
做一个东西之前一定要确保硬件稳定,比如升压IC输出的脉冲是不稳定的,高电平太高,超过输入电压*0.7,而且低电压也不是0V,所以需要我做下拉处理。
2:获取脉冲的方法:
适用于有周期的脉冲,读取脉冲的个数。
if(GPIO_Read_Status(GPIOA0,6) == 1) { text1++; FLAGA=1; } else if(GPIO_Read_Status(GPIOA0,6) == 0) { text2++; FLAGB=1; } |
算法思想,在定时器里面获取脉冲的状态,用数字进行累加,高电平的数值加到多少之后,一旦到了低电平就进行对高电平的累加,一个周期结束统计高电平的脉冲。
if(FLAGA==1) { if(text1>=280) { LEDNUM=5; text1=0; count=0; } else if(text2>=135) { LEDNUM=count; count=0; } else if(text2>=11) {} text2 = 0; FLAGA = 0; }
|
else if(FLAGB==1) { if(text2>=280) { LEDNUM=6; count=0; text2=0; } else if(text1>=3) { count++; } if((LEDNUM_COUNT2_num>=160)) { text1 = 0; FLAGB = 0; }
|
3:ADC开启之后要进行低功耗,需要关闭模拟功能或者数字功能。
ADC->CR |= ADC12_ADCDIS;//关闭模拟功能,进入低功耗
4:低功耗做的好,首先要保证不开看门狗,使用的IO口进入睡眠模式之前一定要处理成高组态模式。ASM32F003高组态不是设置为输入,而是默认状态,设置为0是高组态。
设置为高组态后,在唤醒时一定要把状态设置回来,重新配置为原来的状态。
5:做东西前一定要模块化,面向对象而不是面向结构,东西尽量模块化,可以留有接口。
6:LED 灯的亮灭:
if(IO_state == 1) { f_500ms++; if(f_500ms >4) { f_500ms = 0; if(testTm == 1) testTm = 0; else testTm = 1; if(Led_blink == 1) GPIO_Set_Value(GPIOA0,3,testTm); else if(Led_blink == 2) GPIO_Set_Value(GPIOC0,3,testTm); else if(Led_blink == 3) GPIO_Set_Value(GPIOC0,2,testTm); } } else f_500ms = 0; |
7:不要绝对相信调试模式,因为调试模式手动点的比较慢,可能会出现错误,要借助于现象或者串口来调试。
8:如果需要低功耗LED灯的驱动一定要用单片机来供电,这样低功耗模式下,IO口输出低电平即可,功耗会降低很多。
9:如果用ADC采集时电压过高,可以做分压处理,分压的电阻一定要尽量大,可以降低功耗。
10:下来电阻一定要大,1M的电阻。
11:发光二极管无论什么颜色正负极都是固定的。 1、直插的发光二极管:脚长的是正极,短的是负极。也可以仔细观察管子内部的电极,较小的是正极,大的类似于碗状的是负极。 2、贴片二极管:俯视,一边带彩色线的是负极,另一边是正极。