共2条
1/1 1 跳转至页
AD 请大侠帮忙看看这段AD程序有什么问题

问
#include "config.h"
uint32 ADzhi=0;
void __irq IRQ_Time0(void) //定时器中断
{ uint32 ADC_Data[5];
char str[20];
uint8 t;
uint8 i;
uint32 ADC_SUM;
uint32 ADC_VAL;
t=0; //计数 采5次退出
while(t<5)
{ ADCR=ADCR|(1<<24); //启动AD
while((ADDR&0x80000000)==0);
ADC_Data[t]=ADDR; //读取转换结果
t++;
}
for(i=0;i<5;i++) // 对5次的采样值进行处理
{ ADC_Data[i] = (ADC_Data[i]>>6) & 0x3FF;
ADC_SUM = ADC_SUM + ADC_Data[i];
}
ADC_VAL = ADC_SUM/ 5; //求平均值
ADC_VAL = ADC_VAL * 3300;
ADC_VAL = ADC_VAL/ 1024;
ADzhi=ADC_VAL; //得到AD采样的10进制值
T0IR=0x01; //清除中断标志
VICVectAddr=0x00; //通知VIC中断处理结束
}
void Time0Init(void) /*定时器中断初始化*/
{
T0PR=99; //设置定时器0 分频为100
T0MCR=0x03;
T0MR0=110592; //比较值(1s定时值)
T0TCR=0x03;
T0TCR=0x01;
VICIntSelect=0x00;
VICVectCntl0=0x24;
VICVectAddr0=(uint32)IRQ_Time0;
VICIntEnable=0x00000010;
}
int main(void)
{ PINSEL0=0x00000005;
PINSEL1=0x01400000;
/*进行ADC模块设置*/
ADCR=(1<<0) |
((Fpclk/1000000-1)<<8) | //设置采样频率为1M
(0<<16) |
(0<<17) |
(1<<21) |
(0<<22) |
(0<<27);
Time0Init(); //初始化定时器中断
while(1);
return(0);
} 答 1: ADC_SUM没有初始化为0 答 2: REPINSEL1=0x01400000; 答 3: rePINSEL1=0x01400000;初始化选择的是AD0.0,0.1吧
ARM板子上,引出的只有AD0.0,0.3
是不是硬件连接错误?检查一下]
答 4: 程序修改后还是有问题谢谢各位!这两个确实是错误,我把它们改过来了, 其中 PINSEL1=0x00400000; //AIN0采样 ,硬件连接查过了没错, 可是程序运行后,还是无法得到AD采样的10进制值(单位为mV),不知是何故? 答 5: 感觉PINSEL的配置最倒塌,强烈希望采用尿童写法~~~http://blog.21ic.com/more.asp?name=hotpower&id=16994 答 6: IRQ中断位没有打开IRQ中断位没有打开,CPSR的第7位(从0开始).
NoInt EQU 0x80
IRQEnable
;开IRQ中断
MRS R0, SPSR
BIC R0, R0, #NoInt
MSR SPSR_c, R0
MOVS PC, LR 答 7: remain函数中没有开中断允许:
加上 IRQEnable();//使能IRQ中断
这句话不能少 答 8: 转换结束后加个延时看看
uint32 ADzhi=0;
void __irq IRQ_Time0(void) //定时器中断
{ uint32 ADC_Data[5];
char str[20];
uint8 t;
uint8 i;
uint32 ADC_SUM;
uint32 ADC_VAL;
t=0; //计数 采5次退出
while(t<5)
{ ADCR=ADCR|(1<<24); //启动AD
while((ADDR&0x80000000)==0);
ADC_Data[t]=ADDR; //读取转换结果
t++;
}
for(i=0;i<5;i++) // 对5次的采样值进行处理
{ ADC_Data[i] = (ADC_Data[i]>>6) & 0x3FF;
ADC_SUM = ADC_SUM + ADC_Data[i];
}
ADC_VAL = ADC_SUM/ 5; //求平均值
ADC_VAL = ADC_VAL * 3300;
ADC_VAL = ADC_VAL/ 1024;
ADzhi=ADC_VAL; //得到AD采样的10进制值
T0IR=0x01; //清除中断标志
VICVectAddr=0x00; //通知VIC中断处理结束
}
void Time0Init(void) /*定时器中断初始化*/
{
T0PR=99; //设置定时器0 分频为100
T0MCR=0x03;
T0MR0=110592; //比较值(1s定时值)
T0TCR=0x03;
T0TCR=0x01;
VICIntSelect=0x00;
VICVectCntl0=0x24;
VICVectAddr0=(uint32)IRQ_Time0;
VICIntEnable=0x00000010;
}
int main(void)
{ PINSEL0=0x00000005;
PINSEL1=0x01400000;
/*进行ADC模块设置*/
ADCR=(1<<0) |
((Fpclk/1000000-1)<<8) | //设置采样频率为1M
(0<<16) |
(0<<17) |
(1<<21) |
(0<<22) |
(0<<27);
Time0Init(); //初始化定时器中断
while(1);
return(0);
} 答 1: ADC_SUM没有初始化为0 答 2: REPINSEL1=0x01400000; 答 3: rePINSEL1=0x01400000;初始化选择的是AD0.0,0.1吧
ARM板子上,引出的只有AD0.0,0.3
是不是硬件连接错误?检查一下]
答 4: 程序修改后还是有问题谢谢各位!这两个确实是错误,我把它们改过来了, 其中 PINSEL1=0x00400000; //AIN0采样 ,硬件连接查过了没错, 可是程序运行后,还是无法得到AD采样的10进制值(单位为mV),不知是何故? 答 5: 感觉PINSEL的配置最倒塌,强烈希望采用尿童写法~~~http://blog.21ic.com/more.asp?name=hotpower&id=16994 答 6: IRQ中断位没有打开IRQ中断位没有打开,CPSR的第7位(从0开始).
NoInt EQU 0x80
IRQEnable
;开IRQ中断
MRS R0, SPSR
BIC R0, R0, #NoInt
MSR SPSR_c, R0
MOVS PC, LR 答 7: remain函数中没有开中断允许:
加上 IRQEnable();//使能IRQ中断
这句话不能少 答 8: 转换结束后加个延时看看
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
分享开发笔记,赚取电动螺丝刀(便携轻巧与无刷电机两款可选) | |
看《关键跃升》,聊聊工作心法、动力、能力、沟通与协作,从五个方面深入交流你的工作心得 | |
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
我要给自己挣一部逻辑分析仪 | |
用知识换取送给亲朋的礼物,做个浪漫的开发者 | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 |
打赏帖 | |
---|---|
Buck电路工作在CCM模式下电感电流的计算公式是什么?被打赏5分 | |
buck电路工作原理被打赏5分 | |
基于MSPM0L1306的MODBUS-RTU协议通讯实验被打赏100分 | |
我想要一部加热台+多合一调试工具被打赏18分 | |
每周了解几个硬件知识+485硬件知识分享被打赏10分 | |
【换取手持数字示波器】树莓派PICO调试器官方固件本地化部署实践被打赏24分 | |
【换取手持数字示波器】分享一个KEIL无法识别CMSIS-DAP调试器的解决办法被打赏20分 | |
【换取手持数字示波器】分享一个自制的ArduinoNano扩展板底板被打赏23分 | |
【换取手持示波器】树莓派PICOW网页烟花被打赏18分 | |
【换取手持示波器】树莓派PICO逻辑分析仪被打赏16分 |