作者 主题:[AVR]无法在Atmel Studio中获得ADC值! ADC寄存器不起作用 (Read 2229 times)

0会员和1位客人正在查看此主题。

离线 EXPERMAX.

  • 常规贡献者
  • *
  • 帖子:51
你好 !

我有另一个问题!

不能让ADC正常工作,LED只会在电位器上达到5V!

代码: [选择]
#define F_CPU 16000000UL

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

int cylinder = 5;
uint16_t injection_time = 0;
uint16_t injection_gap = 0;

void delay(int t);
void cycle(void);
void sendFuel(int injector);
void sendSpark(int coil);
void getTPSValue(void);

int main(void)
{
DDRC |= (1 << PORTC0) | (1 << PORTC1) | (1 << PORTC2) | (1 << PORTC3) | (1 << PORTC4) | (1 << PORTC5);
MCUCR |= (1 << ISC01) | (1 << ISC00) | (1 << ISC11) | (1 << ISC10);
GICR |= (1 << INT0) | (1 << INT1);
ADCSRA |= (1 << ADPS0) | (1 << ADPS1) | (1 << ADPS2) | (1 << ADEN);
控制器| =(1<< REFS0) | (1 << ADLAR);

sei();

    while(1)
    {
getTPSValue();

if(injection_time < 512)
{
PORTC |= (1 << PORTC0);
}
if(injection_time > 512)
{
PORTC &= ~(1 << PORTC0);
}
    }
}

void delay(int t)
{
while (t != 0)
{
_delay_ms(1);
t = t - 1;
}
}

ISR(INT0_vect) // CKP
{
cylinder++;
cycle();
}

ISR(INT1_vect) // CMP
{
cylinder = 0;
}

void cycle()
{
if(cylinder == 1)
{
sendFuel(PORTC0);
sendSpark(PORTC4);
}
if(cylinder == 2)
{
sendFuel(PORTC2);
sendSpark(PORTC5);
}
if(cylinder == 3)
{
sendFuel(PORTC3);
sendSpark(PORTC4);
}
if(cylinder == 4)
{
sendFuel(PORTC1);
sendSpark(PORTC5);
}
}

void sendFuel(int injector)
{
PORTC |= (1 << injector);
delay(35);
PORTC &= ~(1 << injector);
delay(35);
}

void sendSpark(int coil)
{
PORTC |= (1 << coil);
delay(10);
PORTC &= ~(1 << coil);
}

void getTPSValue()
{
ADCSRA |= (1 << ADSC);
while(!(ADCSRA & (1 << ADIF)));
ADCSRA |= (1 << ADIF);
injection_time = ADC;
_delay_ms(1);
}

非常感谢你的帮助 !

编辑:做了一些测试,似乎寄存器ADCL完全空,无论ADC0上的输入电压如何!
« 上次编辑:2013年11月23日,04:19:53 AM由ExpectMax »
 

离线 Psi..

  • 超级贡献者
  • ***
  • 帖子:7913
  • 国家: NZ.
Re:[AVR]无法在Atmel Studio中获得ADC值! ADC寄存器不起作用
« 回复#1开: 2013年11月23日,04:24:26»
portc0看起来很奇数,它通常是pc0
但是'可能只是一个新的命名约定我've not seen yet.

« 上次编辑:2013年11月23日,04:28:44 AM由PSI »
希腊信'Psi'(不是每平方英寸磅)
 

离线 Psi..

  • 超级贡献者
  • ***
  • 帖子:7913
  • 国家: NZ.
Re:[AVR]无法在Atmel Studio中获得ADC值! ADC寄存器不起作用
« 回复#2开: 2013年11月23日,04:31:50 AM»
It'可能是adlar = 1'造成你的问题。   (left align)

使用ADC宏与ADLAR = 1可能导致错误的数据(错误方式低位)。

Adlar选项存在的原因是您可以在一个操作中读取8 MSB(当您不时'关心您的应用程序的10bit分辨率)。 
因为你想要完整的10位  (0-1024) 您想要Adlar = 0(默认)。
这种方式读取ADC宏时,它将正确地组装和输出16位字

尝试更换

控制器| =(1<< REFS0) | (1 << ADLAR);



控制器| =(1<< REFS0) ;
« 上次编辑:2013年11月23日,04:45:04由PSI »
希腊信'Psi'(不是每平方英寸磅)
 

离线 EXPERMAX.

  • 常规贡献者
  • *
  • 帖子:51
Re:[AVR]无法在Atmel Studio中获得ADC值! ADC寄存器不起作用
« 回复#3开: 2013年11月24日,05:43:04 PM»
portc0看起来很奇数,它通常是pc0
但是'可能只是一个新的命名约定我've not seen yet.

Atmel Studio(不再是?)无法识别PC0。无论如何Portc0,PC0,PINC0产生相同的十六进制值。

It'可能是adlar = 1'造成你的问题。   (left align)

使用ADC宏与ADLAR = 1可能导致错误的数据(错误方式低位)。

Adlar选项存在的原因是您可以在一个操作中读取8 MSB(当您不时'关心您的应用程序的10bit分辨率)。 
因为你想要完整的10位  (0-1024) 您想要Adlar = 0(默认)。
这种方式读取ADC宏时,它将正确地组装和输出16位字

尝试更换

控制器| =(1<< REFS0) | (1 << ADLAR);



控制器| =(1<< REFS0) ;


是的,它做了诀窍。我还需要更多的时间彻底阅读数据表,现在我理解ADC背后的整个概念,谢谢你的输入!
 


分享我

掘客  Facebook  诽谤  可口的  Technorati.  推特  谷歌  雅虎
SMF.