📄 adc_task.c
字号:
/*
**
****************************************************************************
**
**
** Copyright (c) 2007 - Atmel Corporation
** Proprietaty Information
**
** Project : ATMEGA88 + ATA6824 High Temperature H-bridge System
** Module : ADC_task.c
** Description : Manage ADC to acquire Current (VSHUNT) Supply voltage (Vbat)
** and Speed set
**
**
** Version : Date: Author: Comment:
** 1.0 12.02.2007 F.G. Creation
**
** LICENSE -
**
** ATMEL - 2007
** All software programs are provided 'as is' without warranty of any kind:
** Atmel does not state the suitability of the provided materials for any
** purpose. Atmel hereby disclaim all warranties and conditions with regard
** to the provided software, including all implied warranties, fitness for
** a particular purpose, title and non-infringement.In no event will Atmel
** be liable for any indirect or consequential damages or any damages
** whatsoever resulting from the usage of the software program.
****************************************************************************
**
*/
/*_____ I N C L U D E S ____________________________________________________*/
#include "config.h"
#include "ADC_task.h"
/*_____ M A C R O S ________________________________________________________*/
/*_____ D E F I N I T I O N S ______________________________________________*/
/*_____ P R O T O T Y P E S - D E C L A R A T I O N ________________________*/
/*_____ G L O B A L S ______________________________________________________*/
unsigned int Speed_set; //!< ADC conversion result
unsigned int current; //!< Measured current value (Vshunt signal)
unsigned int V_bat; //!< Battery supply voltage measurement
/*_____ P R I V A T E - F U N C T I O N S __________________________________*/
/*! @brief ADC_Init routine: Set-up ADC to acquire speed set value
* Set-up ADC with following:
* - conversion result right ajusted in ADC data register
* - Reference voltage is AVCC with external capacitor at AREF pin
* - ADC0 selected
* - enable ADC
* - ADC clock set to clk/128
* - Disable ADC0 (PC0) digital input buffer
* INPUTS/OUTPUTS :
* - ADMUX Out
* - ADCSRA Out
* - DIDR0 Out
*/
void ADC_Init(void)
{
/* init ADC */
ADMUX |= (1 << REFS0); // conversion result right ajusted in ADC, AVCC with external capacitor at AREF pin, ADC0 selected
ADCSRA |= (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); // enable ADC, division factor : clk/128
DIDR0 |= (1<<ADC0D); // Disable ADC0 digital input buffer
}
/*! @brief ADC_task manages Current, desired speed and Vbat measurements
* Schedules all acquisitions. When an acquisition is complete, get the result
* and start next one.
*/
void ADC_task(void)
{
static ADC_state_t ADC_state = ADC_INIT_TASK; // ADC state machine init
switch(ADC_state)
{
case ADC_INIT_TASK: // Start current measurement
Set_ADC_Channel(ADC0); // Select ADC0, Vshunt signal
ADC_start_conv(); // Start conversion
ADC_state = ADC_WAIT_CURRENT_MEAS;
break;
//----------------------------------------------------------------------------
case ADC_WAIT_CURRENT_MEAS: // Wait current measurement aquisition
if(ADC_end_conv()) // When ADC conversion is completed
{
ADC_clear_end_conv_flag(); // Clear end conv interrupt flag
current = ADC_data_reg(); // Get Current in ADC data register
Set_ADC_Channel(ADC7); // Select ADC7, Potentiometer speed signal
ADC_start_conv(); // Start conversion
ADC_state = ADC_WAIT_SPEED_SET_MEAS;
}
break;
//----------------------------------------------------------------------------
case ADC_WAIT_SPEED_SET_MEAS: // Wait desired speed measurement aquisition
if(ADC_end_conv()) // When ADC conversion is completed
{
ADC_clear_end_conv_flag(); // Clear end conv interrupt flag
Speed_set = ADC_data_reg(); // Get Speed in ADC data register
Set_ADC_Channel(ADC6); // Select ADC6, Vbat measure signal
ADC_start_conv(); // Start conversion
ADC_state = ADC_WAIT_VBAT_MEAS;
}
break;
//----------------------------------------------------------------------------
case ADC_WAIT_VBAT_MEAS:
if(ADC_end_conv()) // When ADC conversion is completed
{
ADC_clear_end_conv_flag(); // Clear end conv interrupt flag
V_bat = ADC_data_reg(); // Get Speed in ADC data register
Set_ADC_Channel(ADC0); // Select ADC0, Vshunt (current) signal
ADC_start_conv(); // Start conversion
ADC_state = ADC_WAIT_CURRENT_MEAS;
}
break;
//----------------------------------------------------------------------------
default:
ADC_state = ADC_INIT_TASK;
break;
//----------------------------------------------------------------------------
}
}
/*! @brief get_speed Returns desired speed value
*/
unsigned int adc_get_speed(void)
{
return Speed_set;
}
/*! @brief get_current Returns measured current
*/
unsigned int adc_get_current(void)
{
return current;
}
/*! @brief get_V_bat Returns measured supply voltage
*/
unsigned int adc_get_V_bat(void)
{
return V_bat;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -