示例#1
0
文件: hax.c 项目: mkoval/hax
uint16_t analog_get(index_t index)
{
	if (IX_ANALOG(1) <= index && index <= IX_ANALOG(USER_CT_ANALOG) && NUM_ANALOG_VALID(USER_CT_ANALOG)) {
		/* Read ADC (0b10000111 = 0x87). */
		uint8_t chan = 0x87 | (IX_ANALOG_INV(index) << 3);
		adc_setchannel(chan);
		delay10tcy(5); /* Wait for capacitor to charge */
		adc_conv();
		while(adc_busy());
		return adc_read();
	} else {
		WARN_IX(index);
		return 0;
	}
}
示例#2
0
/*
 * init ports
 */
void audioget_init(void) {
	//init adc
	adc_setchannel(AUDIOGET_INPUTCHANNEL);
	adc_init();

	#if AUDIOGET_USETIMER == 1
	//init timer
	ICR1 = TIMER1_ICR1; //ICR1
	TCCR1A = (1 << WGM11); //fast pwm mode
	TCCR1B = (1 << WGM13) | (1 << WGM12);
	TCCR1B |= TIMER1_PRESCALER; //prescaler
	TIMSK |= (1<<TOIE1); //enable timer1
	#endif

	//enable interrupt
	sei();
}
示例#3
0
/*
 * get rms value from audio signal
 * signal must be biased to ADVREF voltage / 2
 */
int16_t audioget_getrmsval(void) {
	static int16_t retval = 0;
	int16_t getval = 0;

	#if AUDIOGET_USETIMER == 1
	while(!audioget_adccollected);
	audioget_adccollected = 1;
	#endif

	#if AUDIOGET_USETIMER == 0
	#if AUDIOGET_DYNAMICBIAS == 1
	int16_t biasadc = 0;
	int16_t biasadcmin = 1024;
	int16_t biasadcmax = 0;
	#endif
	#endif


	//get value using avarage method
	//---------------------------------------
	int32_t rmssquaresum = 0;
	int16_t adc_raw = 0;
	#if AUDIOGET_USETIMER == 0
	adc_setchannel(AUDIOGET_INPUTCHANNEL);
	#endif

	//root mean square to measure value
	uint8_t i = 0;
	for(i=0; i<AUDIOGET_AVARAGESAMPLES; i++) {
		#if AUDIOGET_USETIMER == 1
		adc_raw = audioget_adcsamples[i];
		#else
		adc_raw = adc_readsel();
		#if AUDIOGET_DYNAMICBIAS == 1
		if(adc_raw < biasadcmin)
			biasadcmin = adc_raw;
		if(adc_raw > biasadcmax)
			biasadcmax = adc_raw;
		biasadc = (biasadcmin + (biasadcmax-biasadcmin)/2);
		adc_raw = adc_raw - biasadc;
		#else
		adc_raw = adc_raw - AUDIOGET_BIASZERORAW;
		#endif
		#endif

		rmssquaresum += ((int32_t)adc_raw * (int32_t)adc_raw);
	}
	//root
	getval = sqrt(rmssquaresum/AUDIOGET_AVARAGESAMPLES)-AUDIOGET_AVARAGECORRECTION;


	//smooth filter
	retval = ((int32_t)(64-AUDIOGET_SMOOTHFILTERVAL)*retval+(int32_t)AUDIOGET_SMOOTHFILTERVAL*getval)>>6;

	if(retval<0)
		retval = 0;

	#if AUDIOGET_USETIMER == 1
	audioget_adccollected = 0;
	#endif

	return retval;
}