当前位置:   article > 正文

教你快速使用AD7606的简单驱动方法--并行_ad7606并行数据读取

ad7606并行数据读取

拿到一个芯片,编写驱动前,我们需要仔细阅读芯片的使用手册,根据手册来编写驱动,当然了有些芯片厂家也是提供了驱动,但是你不明白其中的细节和使用方法,也会在引用之中出现大量BUG。这里主要针对AD7606的并行接口的使用,做些细节介绍,方便工程师在使用中的避雷。

只要看懂适应方法,避免误区,驱动程序也可直接引用,方便快捷,省去大量功夫。文章若有错误请指正。话不多说,我们首先来看一下,这个芯片手册。

AD7606具体有4、6和8通道采样,驱动可以做到兼容中无非改一下读取数据多少,电路中对应修改采样通道信息即可。

其他内容信息,也不做介绍,针对并行接口,下面我们来看一下写驱动需要我们重点关注的内容时序图

转换前后时序图如下:

 上图是对于数据的读取方式的时序说明,这里要详细说一下:

举例说明:如果你想要这个AD采样在最高200K下工作,而若想你的采样率真正的达到200K,你还需要在5us周期内调用它,这样你才能保证你的运行时间段内的采样是200K的。而这也需要你必须在5us内将数据读完,而这个5us又需要区分转换前和转换后数据(上图是两种读取数据的方法)。而根据实测,在5us的采样率下,转换时间差不多需要3us左右,即BUSY高电平时间。图二是在BUSY高电平时间内读取上次的转换数据,图三是在BUSY低电平时间内读取,即下次转换前。最高采样周期下,实际只有2us的时间。

上图中两种读取方法选择一种读取(根据自身MCU的时钟主频、采样周期)即可,如果要保证数据的准确性,最好能在低电平时间内读完数据。实测最高采样下,BUSY 高电平转换期间读取数据会出现窜通道现象。低采样周期使用可忽略。

以上时序图,是并行接口读数据,这个相当于看图写程序,配合管脚的说明,只要将对应管脚拉高或者拉低,然后读取数据就可以,很好理解。

芯片的初始化和读数据代码:PS:注意需要复位才有效。

  1. void AD7606Initialization(u8 OverSampleRate)
  2. {//初始化
  3. delay_ms(1);
  4. ADC_RESET_L; //初始复位管脚低电平
  5. switch(OverSampleRate)//采样率选择
  6. {
  7. case 200:OS_NO;break;
  8. case 100:OS_2;break;
  9. case 50: OS_4;break;
  10. case 25: OS_8;break;
  11. default: OS_NO;break;
  12. }
  13. ADC_CS_H;
  14. ADC_CONV_H;
  15. ADC_RD_H;
  16. delay_ms(1);
  17. }

复位使能,初始化后调用即可。

  1. void AD7606Reset(void)
  2. {//脉冲50nS复位有效
  3. ADC_RESET_H;
  4. delay_us(1);
  5. ADC_RESET_L;
  6. delay_us(1);
  7. }

 读取数据代码(BUSY低电平时读取),对应采样率读取,定时器周期调用即可。注意:我这里为了压缩读取的时间,虽没有严格按照手册延时读取数据,却也能正常读取,这里不推荐使用for循环读取数据,循环中变量的执行也会有延时。无需最高频率采样的使用环境,可忽略。

  1. void AD7606ReadSample(void)
  2. {
  3. //开启转换
  4. ADC_CONV_L;
  5. __NOP();// delay_ns(1);
  6. ADC_CONV_H;
  7. __NOP();// delay_ns(1);
  8. //当前数据状态 低电平可读取新数据 高电平可读取上次结果
  9. while(ADC_Busy_State)
  10. {//高电平期间读取数据,过采样开启可用
  11. }
  12. ADC_CS_L;
  13. __NOP();
  14. //BUSY低电平读取新数据
  15. ADC_RD_L;
  16. __NOP(); //delay_ns(32);//低电平时间最少32ns
  17. ADCHData.Ary16[0]=ADC_PDate;
  18. ADC_RD_H;//高电平宽度为15个ns最少
  19. __NOP();//delay_ns(32);//35个ns
  20. ADC_RD_L;
  21. __NOP(); //delay_ns(32);//低电平时间最少32ns
  22. ADCHData.Ary16[1]=ADC_PDate;
  23. ADC_RD_H;//高电平宽度为15个ns最少
  24. __NOP();//delay_ns(35);//35个ns
  25. ADC_RD_L;
  26. __NOP(); //delay_ns(32);//低电平时间最少32ns
  27. ADCHData.Ary16[2]=ADC_PDate;
  28. ADC_RD_H;//高电平宽度为15个ns最少
  29. __NOP();//delay_ns(35);//35个ns
  30. ADC_RD_L;
  31. __NOP(); //delay_ns(32);//低电平时间最少32ns
  32. ADCHData.Ary16[3]=ADC_PDate;
  33. ADC_RD_H;//高电平宽度为15个ns最少
  34. __NOP();//delay_ns(35);//35个ns
  35. ADC_RD_L;
  36. __NOP();//delay_ns(32);//低电平时间最少32ns
  37. ADCHData.Ary16[4]=ADC_PDate;
  38. ADC_RD_H;//高电平宽度为15个ns最少
  39. __NOP();//delay_ns(1);//35个ns
  40. ADC_RD_L;
  41. __NOP(); //delay_ns(1);//低电平时间最少32ns
  42. ADCHData.Ary16[5]=ADC_PDate;
  43. ADC_RD_H;//高电平宽度为15个ns最少
  44. __NOP();//delay_ns(1);//35个ns
  45. ADC_RD_L;
  46. __NOP(); //delay_ns(1);//低电平时间最少32ns
  47. ADCHData.Ary16[6]=ADC_PDate;
  48. ADC_RD_H;//高电平宽度为15个ns最少
  49. __NOP();//delay_ns(1);//35个ns
  50. ADC_RD_L;
  51. __NOP(); //delay_ns(1);//低电平时间最少32ns
  52. ADCHData.Ary16[7]=ADC_PDate;
  53. ADC_RD_H;//高电平宽度为15个ns最少
  54. }

下面是头文件,使用时可以直接调用,修该对应映射的管脚即可:

  1. //ADC7606——AD采集相关参数管脚定义//
  2. //推挽输出模式
  3. #define ADC_CONV_H (set_bit(GPIOA->ODR,0)) //通道转换开始
  4. #define ADC_CONV_L (clr_bit(GPIOA->ODR,0))
  5. #define ADC_RESET_H (set_bit(GPIOA->ODR,3)) //复位管脚使能
  6. #define ADC_RESET_L (clr_bit(GPIOA->ODR,3))
  7. #define ADC_RD_H (set_bit(GPIOA->ODR,6)) //
  8. #define ADC_RD_L (clr_bit(GPIOA->ODR,6))
  9. #define ADC_CS_H (set_bit(GPIOB->ODR,0)) //
  10. #define ADC_CS_L (clr_bit(GPIOB->ODR,0))
  11. //RD下降沿后读取,高电平可提供V1结果,下一个下降延
  12. #define ADC_FSTDATA (GPIOC->IDR & GPIO_Pin_0) //配置为输入模式
  13. //当前数据状态 低电平可读取新数据 高电平可读取上次结果
  14. #define ADC_Busy_State (GPIOB->IDR & GPIO_Pin_1) //配置为输入模式
  15. //并行数据采集
  16. #define ADC_PDate (GPIOD->IDR & GPIO_Pin_All)
  17. //000 200K 调节采样模式---推挽输出
  18. #define ADC_OS0_H (set_bit(GPIOC->ODR,3))
  19. #define ADC_OS0_L (clr_bit(GPIOC->ODR,3))
  20. #define ADC_OS1_H (set_bit(GPIOB->ODR,2))
  21. #define ADC_OS1_L (clr_bit(GPIOB->ODR,2))
  22. #define ADC_OS2_H (set_bit(GPIOC->ODR,13))
  23. #define ADC_OS2_L (clr_bit(GPIOC->ODR,13))
  24. //采样率设置
  25. #define OS_NO ADC_OS0_L;ADC_OS1_L;ADC_OS2_L;
  26. #define OS_2 ADC_OS0_H;ADC_OS1_L;ADC_OS2_L;
  27. #define OS_4 ADC_OS0_L;ADC_OS1_H;ADC_OS2_L;
  28. #define OS_8 ADC_OS0_H;ADC_OS1_H;ADC_OS2_L;
  29. typedef union
  30. {//AD7606对应通道采集数据
  31. u16 Ary16[8];
  32. struct
  33. {
  34. u16 AD7606_1; //
  35. u16 AD7606_2;
  36. u16 AD7606_3;
  37. u16 AD7606_4;
  38. u16 AD7606_5;
  39. u16 AD7606_6;
  40. u16 AD7606_7;
  41. u16 AD7606_8;
  42. }REG;
  43. }AD7606CHDataREG;
  44. extern AD7606CHDataREG ADCHData;
  45. void AD7606Initialization(u8 OverSampleRate);//初始采样率定义
  46. void AD7606ReadSample(void);//周期采样
  47. void AD7606ReadOnceSample(void);//单次数据采集
  48. void AD7606Reset(void);//芯片复位函数

如有疑问,可探讨,错误和不足之处请指教。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/551780
推荐阅读
相关标签
  

闽ICP备14008679号