K60 ADC

来源:互联网 发布:php程序员的发展方向 编辑:程序博客网 时间:2024/05/22 08:14
今天我又花样作死看了一下K60在用LPLD固件库下ADC的使用

由于使用固件库,这里的ADC就像PIC里的一样(51的忘了,好久没用了)

但是这里有几个和以前我接触过得单片机不一样的,就是以前玩的单片机ADC模块都只要设置好VCF基准电压,用哪个通道,像PIC的就多一个左对齐右对齐,时钟选择就没了。
这里还要配置是使用单端采集还是差分采集,ADC精度,采样时间,硬件平均(其实这个我没搞懂是什么东西)

关于单端还是差分,我就用LPLD里用的那个图说好了
K60 <wbr>ADC
如果用单端,就是只用ADC0 DP1把外部的电压读入进行ADC;如果是差分需要把ADC0 DP1和ADC0DM1都读入,取他们的差值ADC,所以会出现负数。我记得LPLD是这么说的,当电压有波动不稳定时,采用单端就会不稳定,但是采用差分就会抵消掉波动,能得到稳定的电压。

ADC精度,我感觉这是 一个非常人性化的设置,居然还可以设置ADC精度,像以前PIC精度都是固定的= =
单端精度有8位10位12位16位
差分精度有9位11位13位16位
对于设置不同的精度,得到的返回值也会不同,例如单端8位0~255,单端16位0~65535;所以不同的精度设置,在调节开发板上的电阻可能会不一样

采样时间应该就是越长越准吧,没这么注意

硬件平均就不知道了,问了同学也没能解决

对了,我的板子上的ADC是这样接的
K60 <wbr>ADC


接下来贴上代码
ADC初始化
void adc_init(void)
{
  //配置ADC采样参数
  adc_init_struct.ADC_Adcx = ADC1;
  adc_init_struct.ADC_DiffMode = ADC_SE;      //单端采集
  adc_init_struct.ADC_BitMode = SE_8BIT;     //单端12位精度
  adc_init_struct.ADC_SampleTimeCfg =SAMTIME_SHORT;    //短采样时间
  adc_init_struct.ADC_HwAvgSel = HW_4AVG;     //4次硬件平均
  adc_init_struct.ADC_CalEnable = TRUE;//使能初始化校验
  //初始化ADC
  LPLD_ADC_Init(adc_init_struct);
  //为了保证复用功能不被占用,最好使能相应ADC通道
  //RUSH开发板的电位器使用DAD1通道进行采集
  //单端DAD1通道的引脚为(ADC1_DM1)
  LPLD_ADC_Chn_Enable(ADC1,AD20); 
}

gpio初始化
void init_gpio()
{
  gpio_init_struct.GPIO_PTx = PTA;
  gpio_init_struct.GPIO_Pins =GPIO_Pin10;
  gpio_init_struct.GPIO_Dir =DIR_OUTPUT;
  gpio_init_struct.GPIO_Output =OUTPUT_H;
  gpio_init_struct.GPIO_PinControl =IRQC_DIS;
  LPLD_GPIO_Init(gpio_init_struct);
}
我这里用的ADC输入,若超过某个值就点亮一盏灯

主函数里一点要初始化ADC和GPIO,我已开始没有初始化GPIO以为我ADC程序错了,检查了半天,还有不要忘记声明ADC,GPIO函数和初始化类
void main (void)
{
  uint16 result;
  
  //初始化ADC
  adc_init();
  init_gpio();
  
  while(1)
  {
    result =LPLD_ADC_Get(ADC1, AD20);
    if(result>100)
     PTA10_O=0;
   else 
     PTA10_O=1;
 
}

运行
一开始没到边界值
K60 <wbr>ADC

到边界值了,有点微闪
K60 <wbr>ADC

超过边界值,就很亮了
K60 <wbr>ADC


oh。。。。。。h,yeah