共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 跳转至页
回复
打赏帖 | |
---|---|
分享一种检测按键状态的方法被打赏20分 | |
周末总结一下,STM32C0系列的开发经验被打赏50分 | |
【换取手持数字示波器】MicrochipMPLABHarmony框架下定时器配置被打赏20分 | |
【换取手持数字示波器】MicrochipMPLABHarmony框架下PWM配置被打赏20分 | |
【Cortex-M】Systick Timer使用被打赏10分 | |
分享汽车防盗系统的组成与分类(一)被打赏5分 | |
VOFA+波形显示+JYD-31蓝牙发送和解析不定长数据被打赏10分 | |
【换取手持数字示波器】-STM32F4PWM控制LED灯管亮度被打赏22分 | |
【换取手持数字示波器】STM32F4驱动RPR-0521RS照度、接近一体型传感器被打赏23分 | |
宏定义和const关键字定义被打赏5分 |