⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adc_task.c

📁 基于Atmel ATMega88+ATA682的应用实例 主要功能包括: 1) PWM输出控制 2) H-Bridge,4 POWER FET 驱动 3) 模拟量比较
💻 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 + -