[原创] 【R7F0C809】LED显示AD采样值

ltbytyn   2015-9-19 15:56 楼主
【R7F0C809】AD采样一贴中已经介绍了R7F0C809 ADC采样。瑞萨的板子上有LED,使用现有的LED将采样显示出来。 1.JPG 2.JPG 3.JPG 看了一下原理图,发现AN0口与LED显示控制SEG6是同一管脚。采样时,AN0(P07)做输入模拟脚,做SEG6控制LED显示时只能做普通输出IO口。因此如果打算用LED来显示采样值,只能采用分时复用的方式。 一段时间做模拟输入口进行ADC采样,过一段时间控制LED显示时做输出口使用。如此反复循环即可实现ADC采样值在LED上显示。
  1. void R_ADC_Get_Result(uint16_t *buffer)
  2. {
  3. *buffer = ((uint16_t)ADCRH << 8 | ADCRL) >> 6;
  4. }
  5. /******************************************************************************
  6. * Function Name: R_ADC_Interrupt
  7. ******************************************************************************/
  8. __interrupt void R_ADC_Interrupt(void)
  9. {
  10. R_ADC_Get_Result( &result_buffer[samle_num] );
  11. samle_flag = 0;
  12. }
  13. void Read_ADC(void)
  14. {
  15. PM0 |= 0x80U; /* use P07 as input mode */
  16. PMC0 |= 0x80U; /* use P07 as analog input */
  17. ADCEN = 1U; /* supply AD clock */
  18. ADM0 = 0x00U; /* disable AD conversion and clear ADM0 register */
  19. ADMK = 0U; /* enable INTAD interrupt */
  20. ADIF = 0U; /* clear INTAD interrupt flag */
  21. ADM0 = 0x02U; /* fCLK/8 */
  22. ADM2 = 0x00U; /* 10 bits */
  23. ADS = 0x00U; /* ANI0 */
  24. ADCE = 1U; /* enable AD comparator */
  25. EI(); /* Enable interrupt */
  26. /* ---- stabilization wait time(about 1us) ---- */
  27. for (count=0U; count<3U; count++)
  28. {
  29. NOP();
  30. }
  31. ADIF = 0U; /* clear INTAD interrupt flag */
  32. ADMK = 0U; /* enable INTAD interrupt */
  33. ADCS = 1U; /* Start AD converter */
  34. }
  35. void ADC_LED(void)
  36. {
  37. uint32_t result;
  38. samle_toale += result_buffer[samle_num];
  39. samle_num++;
  40. if(samle_num > 19)
  41. {
  42. result = samle_toale/20;
  43. result *= 125;
  44. result /= 256;
  45. LED[3] = 0x30+(uint8_t)(result/100);
  46. LED[2] = 0x3A;
  47. LED[1] = 0x30+(uint8_t)((result%100)/10);
  48. LED[0] = 0x30+(uint8_t)(result%10);
  49. samle_toale = 0;
  50. samle_num = 0;
  51. }
  52. }
  53. /******************************************************************************
  54. * Function Name: main
  55. * Description : This function implements main function.
  56. * Arguments : none
  57. * Return Value : none
  58. ******************************************************************************/
  59. void main(void)
  60. {
  61. samle_flag = 1;
  62. samle_num = 0;
  63. samle_toale = 0;
  64. System_Init(); /* Initializes some function moudle */
  65. TS0 |= 0x01; /* Start TAU00 timer */
  66. while(1)
  67. {
  68. while(TMIF00 != 1); /* Wait the TAU00 interrupt flag set to 1*/
  69. TMIF00 = 0; /* TAU00 interrupt flag clear*/
  70. LED_Display(); /* Executive the LED_Display function*/
  71. Read_ADC();
  72. while(samle_flag);
  73. ADC_LED();
  74. PM0 &= 0x7FU;
  75. PMC0 &= 0x7FU; /* use P07 as analog input */
  76. }
  77. }
演示视频见下: [media]http://www.tudou.com/l/yyg2IBS4AEc/&iid=240152430&rpid=327666035&resourceId=327666035_04_05_99/v.swf[/media] 上面说到的分时复用可以解决同一IO充当不同较色的问题。但本文中这样做有没有问题? 有问题。本文只是想给大家一种IO复用的方法。其实许多新手会在这里上一次当。看见下图红线部分了没有,红线圈的部分等效数码管的电路。这么一画,是不是采样的结果貌视就不准确了。有什么办法能解决吗?最常用的就是在绿箭头的地方加一个跟随器来增加输入阻抗。从而让LED回路对ADC采样不能造成影响。 4.JPG 本帖最后由 ltbytyn 于 2015-9-19 15:58 编辑

回复评论 (4)

分享铸就美好未来。。。
点赞  2015-9-19 16:39
这个比较厉害,在条件限制的情况下完成了这个AD值显示
点赞  2015-9-21 21:39
这一类的函数楼主在哪里找到的?

点赞  2015-11-20 10:05
引用: liyang007700 发表于 2015-11-20 10:05
这一类的函数楼主在哪里找到的?

瑞萨官网例程
点赞  2015-11-20 12:48
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复