外部电压检测,AD采样实现
先看看R5F100LEAFB外部ADblock

P20-P27+P03+P02+P147+P120,可以有12通道,操作模式有
连续选择,连续扫描,单次选择,单次扫描四种,我的理解,连续应该是保持一定时时间测的值,就是延时一定时间所得到的值,而单次是像离散采集点,这两种模式,如果所测电压变化不快,用连续模式,如果变化很突然,用单次的模式比较适合。而选择跟扫描,那是跟选择通道有关,多通道一起使用,那就需要扫描模式。
讲完这个,我的是用单通道P20作为AD输入,转换AD为电压值,通过串口发到电脑里。
/*主要程序:*/
void main(void)
{
/* Start user code. Do not edit comment generated here */
UART0_Start();
AD_ComparatorOn();
AD_Start();
while (1U)
{
sendmessage[0]=(UCHAR)(voltage/10000+48);//加48是ASCII码的转换
sendmessage[2]=(UCHAR)((voltage%10000)/1000+48);
sendmessage[3]=(UCHAR)(((voltage%10000)%1000)/100+48);
// sendmessage[4]=(UCHAR)((((voltage%10000)%1000)%100)/10+48);
// sendmessage5=(UCHAR)((((voltage%10000)%1000)%100)%10);
UART0_SendData("当前AD转换值:", 14);
delay(1000);
UART0_SendData(sendmessage, 4);
delay(100);
UART0_SendData("V\r\n", 3);
delay(1000);
}
/* End user code. Do not edit comment generated here */
}
/*电压转换:*/
#pragma vector = INTAD_vect
__interrupt void MD_INTAD(void)
{
/* Start user code. Do not edit comment generated here */
AD_Read(&AD_Reg_Value);
voltage=48*AD_Reg_Value+2;//这是按直线换算,其实觉得有点偏差,更像抛物线
/* End user code. Do not edit comment generated here */
}
/*AD初始化,这是在Applilet3里面产生的,没改动过*/
void AD_Init(void)
{
ADCEN = 1U; /* supply AD clock */
ADM0 = _00_AD_ADM0_INITIALVALUE; /* disable AD conversion and clear ADM0 register */
ADMK = 1U; /* disable INTAD interrupt */
ADIF = 0U; /* clear INTAD interrupt flag */
/* Set INTAD low priority */
ADPR1 = 1U;
ADPR0 = 1U;
ADPC = _02_AD_ADPC_1ANALOG;
/* Set ANI0 pin as analog input */
PM2 |= 0x01U;
ADM0 = _00_AD_CONVERSION_CLOCK_64 | _00_AD_TIME_MODE_STANDARD_1 | _00_AD_OPERMODE_SELECT;
ADM1 = _00_AD_TRIGGER_SOFTWARE | _00_AD_CONVMODE_CONSELECT;
ADM2 = _00_AD_POSITIVE_VDD | _00_AD_NEGATIVE_VSS | _00_AD_AREA_MODE_1 | _00_AD_RESOLUTION_10BIT;
ADUL = _FF_AD_ADUL_VALUE;
ADLL = _00_AD_ADLL_VALUE;
ADS = _00_AD_INPUT_CHANNEL_0;
}
个人总结:串口输出时,原先没加48进行ASCII转换,因为是字符,所以输出的电压值是乱码,后来,检查PC收到的16进制代码分析,才发现是对应的ASCII码
有底纹的是我要的数据,再看

仿真查看AD_Reg_Valve的值通过工式voltage=48*AD_Reg_Value+2,的值很相似,这是我才发现转换的跟发送都没错,只是发送时对应电脑里的ASCII,对照
最全ASCII码对照表.doc
这才发现只是差了一个48,这个问题在以前也遇到过,可这次,弄了大半天才找出最终原因,脑子不好使了....
电脑上接收到的数据:
视频: