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

📄 复件 复件 bldc.h

📁 基于ATMEGA48单片机的
💻 H
字号:
// This file has been prepared for Doxygen automatic documentation generation.
/*! \file ********************************************************************
*
* Atmel Corporation
*
* - File              : BLDC.h
* - Compiler          : IAR EWAAVR 2.28a/3.10c
*
* - Support mail      : avr@atmel.com
*
* - Supported devices : ATmega48/88/168
*
* - AppNote           : AVR444 - Sensorless control of three-phase brushless
'                       DC motors with ATmega48.
*
* - Description       : Example of how to use the ATmega48 for sensorless
*                       control of a three phase brushless DC motor.
*
* $Revision: 1.1 $
* $Date: Monday, October 10, 2005 11:15:46 UTC $
*****************************************************************************/

#ifndef __BLDC_H__
#define __BLDC_H__

//! System clock frequecy. Used to calculate PWM TOP value.
#define SYSTEM_FREQUENCY        8000000

//! PWM base frequency. Used to calculate PWM TOP value.
#define PWM_BASE_FREQUENCY      20000

//! PWM TOP value. Automatically calculated to give desired \ref PWM_BASE_FREQUENCY.
#define PWM_TOP_VALUE           (SYSTEM_FREQUENCY / PWM_BASE_FREQUENCY / 2)

//! Boolean FALSE value.//布尔值  假
#define FALSE     0

//! Boolean TRUE expression. Can be used both for test and assignment.
#define TRUE      (!FALSE)// 布尔值  真

//! Port pin connected to phase U, low side enable switch.//定义U相下桥输出口
#define UL    PB5

//! Port pin connected to phase U, high side enable switch.//定义U相上桥输出口
#define UH    PB4

//! Port pin connected to phase V, low side enable switch.//定义V相下桥输出口
#define VL    PB3

//! Port pin connected to phase V, high side enable switch.//定义V相上桥输出口
#define VH    PB2

//! Port pin connected to phase W, low side enable switch.//定义W相下桥输出口
#define WL    PB1

//! Port pin connected to phase W, high side enable switch.//定义W相上桥输出口
#define WH    PB0

//! Clockwise rotation flag. Used only in macros.	   //顺时针转标志
#define CW    0

//! Counterclockwise rotation flag. Used only in macros.   //逆时针转标志
#define CCW   1

/*! Direction of rotation. Set to either CW or CCW for
 * clockwise and counterclockwise respectively.
 */
#define DIRECTION_OF_ROTATION     CCW//

//! Drive pattern for commutation step 1, CCW rotation.       //逆时针转
#define DRIVE_PATTERN_STEP1_CCW      ((1 << UL) | (1 << VH))

//! Drive pattern for commutation step 2, CCW rotation.
#define DRIVE_PATTERN_STEP2_CCW      ((1 << UL) | (1 << WH))

//! Drive pattern for commutation step 3, CCW rotation.
#define DRIVE_PATTERN_STEP3_CCW      ((1 << VL) | (1 << WH))

//! Drive pattern for commutation step 4, CCW rotation.
#define DRIVE_PATTERN_STEP4_CCW      ((1 << VL) | (1 << UH))

//! Drive pattern for commutation step 5, CCW rotation.
#define DRIVE_PATTERN_STEP5_CCW      ((1 << WL) | (1 << UH))

//! Drive pattern for commutation step 6, CCW rotation.
#define DRIVE_PATTERN_STEP6_CCW      ((1 << WL) | (1 << VH))


//! Drive pattern for commutation step 1, CW rotation.      // 逆时针转
#define DRIVE_PATTERN_STEP1_CW      ((1 << VH) | (1 << WL))

//! Drive pattern for commutation step 2, CW rotation.
#define DRIVE_PATTERN_STEP2_CW      ((1 << UH) | (1 << WL))

//! Drive pattern for commutation step 3, CW rotation.
#define DRIVE_PATTERN_STEP3_CW      ((1 << UH) | (1 << VL))

//! Drive pattern for commutation step 4, CW rotation.
#define DRIVE_PATTERN_STEP4_CW      ((1 << WH) | (1 << VL))

//! Drive pattern for commutation step 5, CW rotation.
#define DRIVE_PATTERN_STEP5_CW      ((1 << WH) | (1 << UL))

//! Drive pattern for commutation step 6, CW rotation.
#define DRIVE_PATTERN_STEP6_CW      ((1 << VH) | (1 << UL))

//! Zero crossing polarity flag value for falling zero crossing.//零极性交换标志值 下降沿
#define EDGE_FALLING          1

//! Zero crossing polarity flag value for rinsing zero crossing.零极性交换标志值  上升沿
#define EDGE_RISING           0

//! PORT register for drive pattern output.			//定义驱动输出端口寄存器
#define DRIVE_PORT  PORTB

//! Data direction register for drive pattern output.		//定义驱动输出数据寄存器
#define DRIVE_DDR   DDRB

//! ADC multiplexer selection for channel U sampling.//定义ADC通道选择  U
#define ADC_MUX_U           0x0

//! ADC multiplexer selection for channel V sampling.//定义ADC通道选择  V
#define ADC_MUX_V           0x1

//! ADC multiplexer selection for channel W sampling.//定义ADC通道选择  W
#define ADC_MUX_W           0x2

//! ADC multiplexer selection for speed reference sampling.//定义ADC速度基准参考值 U
#define ADC_MUX_SPEED_REF   0x4

//! ADC multiplexer selection for current sampling.//当前取样值
#define ADC_MUX_CURRENT     0x3

//! ADC multiplexer selection for reference voltage sampling.//基准电压值
#define ADC_MUX_REF_VOLTAGE 0x5

//! ADC reference channel selection.
#define ADC_REF_CHANNEL                 ((0 << REFS1) | (0 << REFS0))

//! ADC result alignment for BEMF measurement.
#define ADC_RES_ALIGNMENT_BEMF          (1 << ADLAR)

//! ADC result alignment for speed reference measurement.
#define ADC_RES_ALIGNMENT_SPEED_REF     (1 << ADLAR)

//! ADC result alignment for CURRENT measurement.
#define ADC_RES_ALIGNMENT_CURRENT       (1 << ADLAR)

//! ADC result alignment for reference voltage measurement.
#define ADC_RES_ALIGNMENT_REF_VOLTAGE   (1 << ADLAR)

//! ADMUX register value for channel U sampling.
#define ADMUX_U             (ADC_REF_CHANNEL | ADC_RES_ALIGNMENT_BEMF | ADC_MUX_U)

//! ADMUX register value for channel V sampling.
#define ADMUX_V             (ADC_REF_CHANNEL | ADC_RES_ALIGNMENT_BEMF | ADC_MUX_V)

//! ADMUX register value for channel W sampling.
#define ADMUX_W             (ADC_REF_CHANNEL | ADC_RES_ALIGNMENT_BEMF | ADC_MUX_W)

//! ADMUX register value for speed reference sampling.
#define ADMUX_SPEED_REF     (ADC_REF_CHANNEL | ADC_RES_ALIGNMENT_SPEED_REF | ADC_MUX_SPEED_REF)

//! ADMUX register value for current sampling.
#define ADMUX_CURRENT       (ADC_REF_CHANNEL | ADC_RES_ALIGNMENT_CURRENT | ADC_MUX_CURRENT)

//! ADMUX register value for reference voltage sampling.
#define ADMUX_REF_VOLTAGE   (ADC_REF_CHANNEL | ADC_RES_ALIGNMENT_REF_VOLTAGE | ADC_MUX_REF_VOLTAGE)

//! ADC clock prescaled by 8 value.
#define ADC_PRESCALER_8     ((0 << ADPS2) | (1 << ADPS1) | (1 << ADPS0))

//! ADC clock prescaled by 8 value.
#define ADC_PRESCALER_16     ((1 << ADPS2) | (0 << ADPS1) | (0 << ADPS0))

//! ADC prescaler used.
#define ADC_PRESCALER       ADC_PRESCALER_8

//! ADC trigger source.
#define ADC_TRIGGER_SOURCE  ((1 << ADTS2) | (0 << ADTS1) | (0 << ADTS0))

/*! Number of commutations performed during startup. Also specifies
 *  size of \ref startupDelays. Do not change without also changing
 *  \ref MakeTables().
 */
#define STARTUP_NUM_COMMUTATIONS  8

//! Startup delays are given in milliseconds times STARTUP_DELAY_MULTIPLIER.//启动延时
#define STARTUP_DELAY_MULTIPLIER  100

/*!
 *  Number of milliseconds to lock rotor in first commutation step before
 *  the timed startup sequence is initiated.
 */
#define STARTUP_LOCK_DELAY        10000

//! The maximum number of restart attempts without external action when stall is detected.
#define MAX_RESTART_ATTEMPTS    10

//! Holdoff time where zero-cross detection is disabled after commutation.
#define ZC_DETECTION_HOLDOFF_TIME_US (filteredTimeSinceCommutation / 2)

//! Macro that sets a new duty cycle by changing the PWM compare value.
#define SET_PWM_COMPARE_VALUE(compareValue)          (OCR0B = compareValue)

//! Macro that clears all Timer/counter0 interrupt flags.
#define CLEAR_ALL_TIMER0_INT_FLAGS    (TIFR0 = TIFR0)

//! Macro that disables all Timer/Counter0 interrupts.
#define DISABLE_ALL_TIMER0_INTS       (TIMSK0 = 0)

//! Macro that enables Timer/Counter0 interrupt where zero crossings are detected.
#define SET_TIMER0_INT_ZC_DETECTION   (TIMSK0 = (1 << TOIE0))

//! Macro that clears all Timer/Counter1 interrupt flags.
#define CLEAR_ALL_TIMER1_INT_FLAGS    (TIFR1 = TIFR1)

//! Macro that disables all Timer/Counter1 interrupts.
#define DISABLE_ALL_TIMER1_INTS       (TIMSK1 = 0)

//! Macro that enable Timer/Counter1 interrupt responsible for commutation.
#define SET_TIMER1_INT_COMMUTATION    (TIMSK1 = (1 << OCIE1A))

//! Macro that enables Timer/Counter1 interrupt responsible for enabling ADC sampling after ADC holdoff period.
#define SET_TIMER1_INT_HOLDOFF        (TIMSK1 = (1 << OCIE1B))

//! External reference voltage in milliVolts.
#define EXTERNAL_REF_VOLTAGE      ((4930UL * 10) / 43)

//! Current measurement shunt value in milliOhm.
#define SHUNT_RESISTANCE          220

//! The ADC resolution used.
#define ADC_RESOLUTION   256

/*!
 *  The number of Timer/Counter1 ticks per second. Equals
 *  MCU clock frequency / Timer/counter1 prescaler.
 */
#define TICKS_PER_SECOND    1000000UL

//! The number of Timer/Counter1 ticks per minute.
#define TICKS_PER_MINUTE    (TICKS_PER_SECOND * 60)

/*! \brief Input value relative gain in IIR filter.
 *
 *  This value specifies the relative gain given to the input value in the IIR filter.
 *  The value should be an integer. Make sure that COEFF_A + COEFF_B is a power of 2,
 *  to avoid instability.
 */
#define COMMUTATION_TIMING_IIR_COEFF_A      1

/*! \brief Relative feedback gain in IIR filter.
 *
 *  This value specifies the relative feedback gain given to the input value in the IIR filter.
 *  The value should be an integer. Make sure that COEFF_A + COEFF_B is a power of 2,
 *  to avoid instability.
 */
#define COMMUTATION_TIMING_IIR_COEFF_B      3

//! Uncomment one of the following lines to choose open or closed loop speed control.
#define SPEED_CONTROL_OPEN_LOOP
//#define SPEED_CONTROL_CLOSED_LOOP

//! The current value in milliAmpere where the current limiter starts to kick in.
#define CURRENT_LIMITER_START         2500

//! The current value in milliAmpere where the motor should be shut down.
#define CURRENT_LIMITER_CRITICAL      3000

/*!
 *  Uncomment the following line if the analog comparator should be used to
 *  detect overcurrent.
 */
#define ANALOG_COMPARATOR_ENABLE

/*!
 *  The maximum duty cycles is decreased by this number of PWM duty cycle steps
 *  per milliAmpere current consumption over \ref CURRENT_LIMITER_START.
 */
#define CURRENT_LIMITER_FACTOR   (1 / 5)

//! Macro that cuts all power to the motor.
#define DISABLE_DRIVING               (DRIVE_PORT = 0x00)

//! PWM compare value used during startup.
#define STARTUP_PWM_COMPARE_VALUE  130

//! Zero-cross threshold.
#define ADC_ZC_THRESHOLD 0x98

/*!
 *  The number of milliseconds to subtract from the zero-crossing to commutation time.
 *  Used to compensate for zero-cross sample frequency.
 */
#define COMMUTATION_CORRECTION 50

//! The minimum allowed PWM compare value.
#define MIN_PWM_COMPARE_VALUE    90

//! The maximum allowed PWM compare value.
#define MAX_PWM_COMPARE_VALUE    200

//! The minimum allowed speed. (Only has effect when closed loop speed control is used)
#define MIN_SPEED 3000UL

//! The maximum allowed speed. (Only has effect when closed loop speed control is used)
#define MAX_SPEED 8000UL

//! P-regulator proportional gain.
#define P_REG_K_P 64

//! P-regulator scaling factor. The result is divided by this number.
#define P_REG_SCALING 65536

static void ResetHandler(void);
static void InitPorts(void);
static void InitTimers(void);
static void InitADC(void);
static void InitAnalogComparator(void);
static void WatchdogTimerEnable(void);
static void MakeTables(void);
static void StartMotor(void);
static void PWMControl(void);
static void StartupDelay(unsigned int delay);
static unsigned long CalculateSpeed();
static unsigned long CalculateSpeedSetpoint();
static unsigned int CalculateCurrent();
static signed int SpeedControl(void);
static unsigned char CurrentControl(void);


#endif  // File guard

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -