当前位置:   article > 正文

ZYNQ项目实战 — 基于ADC128S102的简单电压表设计_adc管脚约束

adc管脚约束

源码下载:GitHub - Redamancy785/FPGA-Learning-Record: 项目博客:https://blog.csdn.net/weixin_51460407

一、电压采集部分

基于SDK+C ZYNQ开发 — 基于ADC128S102的简单电压表设计 — 电压采集部分-CSDN博客文章浏览阅读447次,点赞4次,收藏14次。CPHA = 0 第一个时钟沿采样CPHA = 1 第一个时钟沿翻转CPOL = 0 初始时钟脉冲为低电平CPPL = 1 初始时钟脉冲为高电平。https://blog.csdn.net/weixin_51460407/article/details/137382876

二、数码管显示部分

基于SDK+C ZYNQ开发 — 基于ADC128S102的简单电压表设计 — 数码管显示部分-CSDN博客文章浏览阅读108次。移位的同时,也在进行采样。结合数据手册分析,时序可以是如下两种情况:即SPI可以工作在两种模式之中:具体分析两种工作模式:发现00模式下,SS信号短暂的拉高是有害的,所以00模式需要手动SS。https://blog.csdn.net/weixin_51460407/article/details/137423351

三、简易电压表设计

1、VIVADO端

①、构建硬件系统

②、管脚约束

 

        管脚约束中有些管脚没有使用到,为了避免在分析综合时报错,要在xdc文件的最开始加入如下代码,即可编译通过。

set_property SEVERITY {Warning} [get_drc_checks NSTD-1]

set_property SEVERITY {Warning} [get_drc_checks RTSTAT-1]

set_property SEVERITY {Warning} [get_drc_checks UCIO-1]

2、SDK端

        使用应用库编写代码:

        以上编译库是小梅哥为开发板提供的应用库,直接添加到自己的工程中即可。可自行下载:

【ACZ7015】ACZ7015型ZYNQ+PCIE开发板用户自助服务手册 - ACZ7015开发板 - 芯路恒电子技术论坛 - Powered by Discuz!

 ①、main.c部分

  1. #include "COMMON.h"
  2. //用于存储数码管的编码值,依次为0,1,2,3,4,5,6,7,8,9,-,.
  3. uint8_t Seg_Code[12] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0x7F};
  4. //赋予初值,数码管编码CH- 0.000
  5. uint8_t Dig_Data[8][2] = {{0xC6,0x80},{0x89,0x40},{0xBF,0x20},{0xFF,0x10},
  6. {0x40,0x08},{0xC0,0x04},{0xC0,0x02},{0xC0,0x01}};
  7. //设置ADC通道为INT0
  8. uint8_t ADC_Channel = 0;
  9. int main()
  10. {
  11. uint16_t i;
  12. uint8_t Set_Channel[2] = {0x00,0x00}; //存储发送的通道数据8*2=16bit
  13. uint8_t ADC_Raw_Data[2]; //存储读取的ADC原始数据8*2=16bit
  14. uint32_t ADC_Acc_Val; //存储ADC累加值
  15. float ADC_Val; //ADC电压值
  16. ScuGic_Init(); //初始化通用中断控制器
  17. //初始化SPI0设备,设为主机模式,11 模式
  18. PS_SPI_Init(&SPI0, XPAR_XSPIPS_0_DEVICE_ID, XSPIPS_CLK_PRESCALE_16, XSPIPS_MASTER_OPTION
  19. | XSPIPS_CLK_PHASE_1_OPTION
  20. | XSPIPS_CLK_ACTIVE_LOW_OPTION
  21. );
  22. //初始化SPI1设备,设为主机模式,11模式
  23. PS_SPI_Init(&SPI1, XPAR_XSPIPS_1_DEVICE_ID, XSPIPS_CLK_PRESCALE_8, XSPIPS_MASTER_OPTION
  24. | XSPIPS_CLK_PHASE_1_OPTION
  25. | XSPIPS_CLK_ACTIVE_LOW_OPTION
  26. );
  27. ScuTimer_Int_Init(2000); //初始化定时器,设置为2000us启动定时器
  28. while (1) {
  29. ADC_Acc_Val = 0; //ADC累加值清零
  30. Set_Channel[0] = ADC_Channel << 3; //使用通道值计算设定值
  31. //ADC原始数据累加1024次
  32. for (i = 0;i < 1024;i++) {
  33. PS_SPI_Transfer(&SPI0, 0, ADC_Raw_Data, Set_Channel, 2); //用SPI与ADC128S通信,收发2字节
  34. ADC_Acc_Val += ((ADC_Raw_Data[0] & 0x0F) << 8) + ADC_Raw_Data[1]; //ADC数值累加
  35. }
  36. ADC_Val = ADC_Acc_Val / 1024 * 3.3 / 4095 ; //将累加值除以1024取平均值,然后使用公式换算为电压值
  37. Dig_Data[2][0] = Seg_Code[ADC_Channel]; //通道值
  38. Dig_Data[4][0] = Seg_Code[(int)ADC_Val] & 0x7F; //电压整数位
  39. Dig_Data[5][0] = Seg_Code[(int)(ADC_Val * 10) % 10]; //电压值十分位
  40. Dig_Data[6][0] = Seg_Code[(int)(ADC_Val * 100) % 10]; //电压值百分位
  41. Dig_Data[7][0] = Seg_Code[(int)(ADC_Val * 1000) % 10]; //电压值千分位
  42. usleep(500000); //每500ms更新一次数值
  43. }
  44. }

②、ISR.c部分

  1. #include "ISR.h"
  2. extern uint8_t Dig_Data[8][2];
  3. static uint8_t i;
  4. /**
  5. *****************************************************
  6. * @brief 私有定时器中断处理程序
  7. * @tag 本函数用来处理私有定时器中断,在内部加入用户程序即可
  8. *****************************************************
  9. **/
  10. void ScuTimer_IRQ_Handler(void *CallBackRef)
  11. {
  12. /* ↓↓↓用户处理↓↓↓ */
  13. //每过2ms用SPI控制数码管显示第i位数据
  14. PS_SPI_Transfer(&SPI1, 0, 0, Dig_Data[i], 2);
  15. if(i<8)
  16. i++;
  17. else
  18. i = 0;
  19. /* ↑↑↑结束处理↑↑↑ */
  20. XScuTimer_ClearInterruptStatus(&ScuTimer);
  21. }

 四、硬件连接

        左边排针是模拟输入 右边排针是GND。

五、结果验证

 数码管显示结果:通道0 1.604V

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

闽ICP备14008679号