×
嵌入式 > 技术百科 > 详情

音效集成PT2314,PT2313的使用指导

发布时间:2020-06-09 发布时间:
|
使用预编译巧妙实现AD按键程序算法
                                      

 

常见AD电阻网络连接方式一般为下图连接方式,对于不同的应用,可能电阻有所调整,如何使用宏定义实现ADC值自动计算?

                                                                                     |
                                                                                     Z 10K
                                                                                     Z
     1200        1000     820         680         560        470  |
-----WW------WW-----WW-------WW------WW------WW------------ >ADC
  |            |             |             |            |              |            |
   \K0        \K1         \K2         \K3        \K4          \K5        \K6 
  |            |             |             |            |              |            |
  =          =             =           =            =             =           =

为代码便于调整,现定义宏,设定每个电阻值:

//ADC 电路采样参数
#define RES_POL    10   //上拉电阻,单位K
#define ADC_MAX    1024  //ADC采样精度
//AD键盘各个电阻值,单位是K
#define RES0    0.01
#define RES1    0.47
#define RES2    0.56
#define RES3    0.68
#define RES4    0.82
#define RES5    1.00
#define RES6    1.20
#define RES7    1.50
#define RES8    1.80
#define RES9    2.20
#define RES10    2.70
#define RES11    3.30
#define RES12    4.70
#define RES13    6.80
#define RES14    10.0
#define RES15    18.0
#define RES16    33.0
#define RES17    82.0

然后计算每个开关电阻累加和

#define RES_SUM0   (RES0)
#define RES_SUM1   (RES_SUM0+RES1)
#define RES_SUM2   (RES_SUM1+RES2)
#define RES_SUM3   (RES_SUM2+RES3)
#define RES_SUM4   (RES_SUM3+RES4)
#define RES_SUM5   (RES_SUM4+RES5)
#define RES_SUM6   (RES_SUM5+RES6)
#define RES_SUM7   (RES_SUM6+RES7)
#define RES_SUM8   (RES_SUM7+RES8)
#define RES_SUM9   (RES_SUM8+RES9)
#define RES_SUM10   (RES_SUM9+RES10)
#define RES_SUM11   (RES_SUM10+RES11)
#define RES_SUM12   (RES_SUM11+RES12)
#define RES_SUM13   (RES_SUM12+RES13)
#define RES_SUM14   (RES_SUM13+RES14)
#define RES_SUM15   (RES_SUM14+RES15)
#define RES_SUM16   (RES_SUM15+RES16)
#define RES_SUM17   (RES_SUM16+RES17)

再通过预编译运算出实际的ADC值

#define KEY_ADC0   (RES_SUM0/(RES_SUM0+RES_POL)*ADC_MAX)
#define KEY_ADC1   (RES_SUM1/(RES_SUM1+RES_POL)*ADC_MAX)
#define KEY_ADC2   (RES_SUM2/(RES_SUM2+RES_POL)*ADC_MAX)
#define KEY_ADC3   (RES_SUM3/(RES_SUM3+RES_POL)*ADC_MAX)
#define KEY_ADC4   (RES_SUM4/(RES_SUM4+RES_POL)*ADC_MAX)
#define KEY_ADC5   (RES_SUM5/(RES_SUM5+RES_POL)*ADC_MAX)
#define KEY_ADC6   (RES_SUM6/(RES_SUM6+RES_POL)*ADC_MAX)
#define KEY_ADC7   (RES_SUM7/(RES_SUM7+RES_POL)*ADC_MAX)
#define KEY_ADC8   (RES_SUM8/(RES_SUM8+RES_POL)*ADC_MAX)
#define KEY_ADC9   (RES_SUM9/(RES_SUM9+RES_POL)*ADC_MAX)
#define KEY_ADC10   (RES_SUM10/(RES_SUM10+RES_POL)*ADC_MAX)
#define KEY_ADC11   (RES_SUM11/(RES_SUM11+RES_POL)*ADC_MAX)
#define KEY_ADC12   (RES_SUM12/(RES_SUM12+RES_POL)*ADC_MAX)
#define KEY_ADC13   (RES_SUM13/(RES_SUM13+RES_POL)*ADC_MAX)
#define KEY_ADC14   (RES_SUM14/(RES_SUM14+RES_POL)*ADC_MAX)
#define KEY_ADC15   (RES_SUM15/(RES_SUM15+RES_POL)*ADC_MAX)
#define KEY_ADC16   (RES_SUM16/(RES_SUM16+RES_POL)*ADC_MAX)
#define KEY_ADC17   (RES_SUM17/(RES_SUM17+RES_POL)*ADC_MAX) 

这样,在ADC采样运用中可设计如下数组:

UINT16 keyAdcTable1[] = {
 KEY_ADC0,
 KEY_ADC1,
 KEY_ADC2,
 KEY_ADC3,
 KEY_ADC4,
 KEY_ADC5,
 KEY_ADC7,
 KEY_ADC8,
 KEY_ADC9,
 KEY_ADC10,
 KEY_ADC11,
 KEY_ADC12,
 KEY_ADC17,
 };

通过查表法可方便的获得当前某个按键是否按下。

此法在运算上没有特别之处,只是巧妙利用C的预编译处理,美化代码,同时简洁了操作步骤,常规的固定值计算方法如果某个电阻发生变化,需要调整后续一系列ADC计算值,非常不方便,如有更巧妙算法,欢迎讨论!

 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ADI 高精度低功耗精密放大器