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