共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网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |