[活动专区] 赛元易码魔盒体验——11.测试拓展板的ADC

[复制链接]
889|9
 楼主| 一路向北lm 发表于 2020-7-16 08:22 | 显示全部楼层 |阅读模式
本次咱来测试一下板卡的ADC功能,先来看一下拓展板的原理图,分别是两路ADC,AIN6和AIN7,AIN6可以直接旋转可调电阻就可以使AD的值变化,AIN7使外部输入的电压信号。这里就以AIN6为例,使用魔盒测试一下。
285425f0f9dc613f6a.png
111495f0f9dccdc143.png

 楼主| 一路向北lm 发表于 2020-7-16 08:23 | 显示全部楼层
打开魔盒,配置串口UART0和定时器3以及ADC的AIN6,同时也配置了LED引脚为推挽输出,采样口选择千万不要忘记,具体配置如下:
851115f0f9dea38298.png
 楼主| 一路向北lm 发表于 2020-7-16 08:23 | 显示全部楼层
使用魔盒生成代码,这次我们使用串口来打印ADC的数据,LED作为指示,打开生成的工程,同时有adc、timer、uart0、gpio四个外设驱动文件。
112195f0f9df961e6b.png
 楼主| 一路向北lm 发表于 2020-7-16 08:23 | 显示全部楼层
在定时器3中断中设计标志位,同时LED翻转,暂且设定为1s打印一次ADC的数据。
生成的工程直接使用是有问题的,需要修改一下1个地方:注释TIM3_WorkMode1Config函数中TLX和THX的赋值
781285f0f9e0eade9f.png
 楼主| 一路向北lm 发表于 2020-7-16 08:24 | 显示全部楼层
在串口中断服务函数中添加如下代码,完成对串口的发送和接收。
  1. unsigned char UartSendFlag;
  2. unsigned char UartReceiveFlag;
  3. void UART0Interrupt()                interrupt 4               
  4. {
  5.     /*<UserCodeStart>*/
  6.              if(TI)
  7.         {
  8.                 TI = 0;        
  9.                 UartSendFlag = 1;               
  10.         }
  11.         if(RI)
  12.         {
  13.                 RI = 0;        
  14.                 UartReceiveFlag = 1;
  15.         }        
  16.     /*<UserCodeEnd>*/
  17.         /*UART0_it write here*/               
  18. }


 楼主| 一路向北lm 发表于 2020-7-16 08:24 | 显示全部楼层
串口驱动uart0.c文件中添加如下代码支持对字符和字符串的发送
  1. extern unsigned char UartSendFlag;
  2. extern unsigned char UartReceiveFlag;
  3. /*****************************************************
  4. *函数名称:Uart_Send_Byte(unsigned char byte)
  5. *函数功能:串口发送一个字节函数
  6. *入口参数:unsigned char byte
  7. *出口参数:void
  8. *****************************************************/
  9. void Uart_Send_Byte(unsigned char byte)
  10. {
  11.   
  12.           SBUF = byte;
  13.                 while(!UartSendFlag);
  14.           UartSendFlag = 0;
  15.   
  16. }
  17. /*****************************************************
  18. *函数名称:void Uart_Send_String(unsigned char *str)
  19. *函数功能:串口发送字符串函数
  20. *入口参数:unsigned char *str
  21. *出口参数:void
  22. *****************************************************/
  23. void Uart_Send_String(unsigned char *str)
  24. {
  25.     while(*str)
  26.                 {
  27.                   Uart_Send_Byte(*str);
  28.                         str++;
  29.                 }
  30. }


 楼主| 一路向北lm 发表于 2020-7-16 08:25 | 显示全部楼层
这样的话,定时器和串口都可以正常工作,在定时器3中断服务函数处理如下:
  1. void Timer3Interrupt()                interrupt 13
  2. {
  3.     /*<UserCodeStart>*/
  4.          static unsigned int count = 0;
  5.     TXINX = 0x03;   //选择定时器T3
  6.           TFX = 0;        //溢出清零
  7.         count++;
  8.         if(count == 1000)
  9.         {
  10.           count = 0;
  11.                 timeflag = 1;
  12.           LED_TOGGLE;       
  13.         }
  14.     /*<UserCodeEnd>*/
  15.         /*Timer3_it write here*/               
  16. }


 楼主| 一路向北lm 发表于 2020-7-16 08:25 | 显示全部楼层
主函数中添加串口字符串打印和adc转换函数,具体测试代码如下:
  1. extern unsigned char timeflag;
  2. uint16_t ad_value;

  3. void main(void)
  4. {       
  5. /*<UserCodeStart>*/

  6. /*<UserCodeEnd>*/
  7.     /*** MCU初始化函数 ***/
  8.     SC_Init();
  9.    while(1)
  10.         {
  11.                 if(timeflag == 1)
  12.                 {
  13.                   timeflag = 0;
  14.                         ADC_StartConversion();
  15.                         Uart_Send_String("ADC AIN6的值为:");
  16.                     ad_value = ADC_GetConversionValue();
  17.                 Uart_Send_Byte(ad_value/1000+0x30);
  18.                         Uart_Send_Byte(ad_value%1000/100+0x30);
  19.                         Uart_Send_Byte(ad_value%100/10+0x30);
  20.                         Uart_Send_Byte(ad_value%10+0x30);
  21.                         Uart_Send_Byte('\n');
  22.                 }        
  23.         }   
  24. }


 楼主| 一路向北lm 发表于 2020-7-16 08:25 | 显示全部楼层
旋转可调电阻 串口助手打印数据如下,ADC也搞定啦哈!魔盒生成的ADC也没有任何问题。
337455f0f9e9037fc6.png
 楼主| 一路向北lm 发表于 2020-7-16 08:26 | 显示全部楼层
到这里,我总结一下:好吧,这里又发现了一个秘密,就是不用注释TIM3_WorkMode1Config函数中TLX和THX的赋值和串口中断的注释也可以正常运行了,前提是你需要在主函数中有个while(1)循环,如果只是简单的初始化,那么定时器中断和串口中断不会触发,我现在都感觉好奇怪。如下,模式1需要注释,模式2不需要注释。
模式1:进不了定时器中断和串口中断,定时器中断必须屏蔽TIM3_WorkMode1Config函数中TLXTHX的赋值,串口不能进入中断。
  1. void main(void)
  2. {       
  3.     /*** MCU初始化函数 ***/
  4.     SC_Init();
  5.    
  6. }
模式2:可正常使用定时器中断和串口中断
  1. void main(void)
  2. {       
  3. /*<UserCodeStart>*/

  4. /*<UserCodeEnd>*/
  5.     /*** MCU初始化函数 ***/
  6.     SC_Init();
  7.    while(1)
  8.         {
  9.                 /*********执行代码部分*******************/
  10.        xxxxxxxxxxxxxxxxxxx
  11.         }
  12.    
  13. }


您需要登录后才可以回帖 登录 | 注册

本版积分规则

293

主题

3837

帖子

81

粉丝
快速回复 在线客服 返回列表 返回顶部