源码
HRTIM
产品概况
因为太长会无法提交,本来想一次写完结果只能分成两次,这次解析初始化部分
*本帖子是基于官方例程源码BB4805S_CMC DEMO V3.1的我的个人理解*
------------
# 〇、HRTIM简介
这是摘自STM32F334数据手册的英文原文及有道翻译,可以看出HRTIM非常强大*(不想看请跳过)*
>
The high-resolution timer (HRTIM1) allows generating digital signals with high-accuracy
timings, such as PWM or phase-shifted pulses.
It consists of 6 timers, 1 master and 5 slaves, totaling 10 high-resolution outputs, which can
be coupled by pairs for deadtime insertion. It also features 5 fault inputs for protection
purposes and 10 inputs to handle external events such as current limitation, zero voltage or
zero current switching.
HRTIM1 timer is made of a digital kernel clocked at 144 MHz followed by delay lines. Delay
lines with closed loop control guarantee a 217 ps resolution whatever the voltage,
temperature or chip-to-chip manufacturing process deviation. The high-resolution is
available on the 10 outputs in all operating modes: variable duty cycle, variable frequency,
and constant ON time.
The slave timers can be combined to control multiswitch complex converters or operate
independently to manage multiple independent converters.
The waveforms are defined by a combination of user-defined timings and external events
such as analog or digital feedbacks signals.
HRTIM1 timer includes options for blanking and filtering out spurious events or faults. It also
offers specific modes and features to offload the CPU: DMA requests, burst mode controller,
push-pull and resonant mode.
It supports many topologies including LLC, Full bridge phase shifted, buck or boost
converters, either in voltage or current mode, as well as lighting application (fluorescent or
LED). It can also be used as a general purpose timer, for instance to achieve high-resolution
PWM-emulated DAC.
In debug mode, the HRTIM1 counters can be frozen and the PWM outputs enter safe state.
高分辨率定时器(HRTIM1)允许生成高精度的数字信号计时,如PWM或相移脉冲。
它由6个定时器,1个主控器和5个从控器组成,共10个高分辨率输出,可以实现
通过对进行耦合以进行死时间插入。它还具有5个故障输入保护目的和10个输入来处理外部事件,如电流限制,零电压或零电流开关。
HRTIM1定时器是由一个数字内核组成,它的时钟频率为144 MHz,后面跟着延迟线。延迟
带有闭环控制的线路保证了217 ps的分辨率,温度或芯片间制造工艺偏差。高分辨率是可在所有工作模式的10个输出:可变占空比,可变频率,以及时间常数。
从式定时器可以组合起来控制多开关复杂转换器或操作独立管理多个独立转换器。
波形是由用户定义的时间和外部事件的组合来定义的例如模拟或数字反馈信号。
HRTIM1定时器包括删除和过滤虚假事件或错误的选项。它还提供特定的模式和功能来卸载CPU: DMA请求,突发模式控制器,推挽和共振模式。
它支持许多拓扑结构,包括LLC、全桥移相、buck或boost转换器,无论是在电压或电流模式,以及照明应用(荧光灯或领导)。它也可以作为一个通用的定时器,例如实现高分辨率PWM-emulated DAC。
在调试模式下,HRTIM1计数器可以被冻结,PWM输出进入安全状态。
# 一、初始化函数调用
## dp_BuckBoostCtrlInit()
dp_BuckBoostCtrlInit()在main函数的第9行执行,功能就是初始化BuckBoost相关的变量以及外设
```c
// *
// **********************************************************
// * @函数:void dp_cntl_init(void)
// * @描述:初始化
// * @输入:无
// * @返回:无
// * @作者:何。小P
// * @版本:V1.0,2017-03-18
// *********************************************************
// *
void dp_BuckBoostCtrlInit(void)
{
gVoltOutStr.Value = 0;
gVoltOutStr.Offset = 0;
gVoltOutStr.Coeff = DP_VOLTAGE_OUT_RATIO;
gCurrOutStr.Value = 0;
gCurrOutStr.Offset = DP_ADC_OUT_OFFSET;
gCurrOutStr.Coeff = DP_CURRENT_OUT_RATIO;
gVoltInStr.Value = 0;
gVoltInStr.Offset = 0;
gVoltInStr.Coeff = DP_VOLTAGE_IN_RATIO;
gCurrInStr.Value = 0;
gCurrInStr.Offset = DP_ADC_IN_OFFSET;
gCurrInStr.Coeff = DP_CURRENT_OUT_RATIO;
dr_AdcInit(); //初始化ADC
dr_PwmInit(DP_PWM_FREQUENCY);//初始化PWM
pid_func.reset(&gPID_VoltOutLoop);
gPID_VoltOutLoop.T = 0.40f;//PID控制周期,单位100us
gPID_VoltOutLoop.Kp = 4.50f;
gPID_VoltOutLoop.Ti = 2.15f;
gPID_VoltOutLoop.Td = 0.00f;
gPID_VoltOutLoop.OutMin = 0.05f * DP_PWM_PER;//最小占空比
gPID_VoltOutLoop.OutMax = 1.70f * DP_PWM_PER;//最大占空比
pid_func.init(&gPID_VoltOutLoop);
pid_func.reset(&gPID_CurrOutLoop);
gPID_CurrOutLoop.T = 0.40f;//PID控制周期,单位10us
gPID_CurrOutLoop.Kp = 6.45f;
gPID_CurrOutLoop.Ti = 1.42f;
gPID_CurrOutLoop.Td = 0.00f;
gPID_CurrOutLoop.OutMin = 0.05f * DP_PWM_PER;//最小占空比
gPID_CurrOutLoop.OutMax = 1.70f * DP_PWM_PER;//最大占空比
pid_func.init(&gPID_CurrOutLoop);
}
```
13-27行对电压、电流采集的相关系数进行初始化。
29行进行ADC的初始化,主要就是4个ADC通道,7.5采样周期,DMA,由HRTIM一个硬件触发源触发,200KHz采样频率。
30行就是HRTIM的PWM初始化,也是这个帖子的重点,DP_PWM_FREQUENCY为200e3,可以看出这个电源的频率为200KHz。
下面的就是PID的清零与参数计算
## dr_PwmInit(DP_PWM_FREQUENCY);
这个函数可以说是该帖子的核心,我也是第一次接触高分辨率定时器,看来一眼简介着实被吓到了,先看代码
```c
// *
// **********************************************************
// * @函数:void dr_PwmInit(uint32 fsw)
// * @描述:PWM初始化
// * @输入:fsw :开关频率
// * @返回:无
// * @作者:何。小P
// * @版本:V1.1, 2019-03-18
// **********************************************************
// *
void dr_PwmInit(uint32 fsw)
{
GPIO_InitTypeDef GPIO_InitStructure;
HRTIM_BaseInitTypeDef HRTIM_BaseInitStructure;
HRTIM_TimerCfgTypeDef HRTIM_TimerWaveStructure;
HRTIM_TimerInitTypeDef HRTIM_TimerInitStructure;
HRTIM_OutputCfgTypeDef HRTIM_TIM_OutputStructure;
HRTIM_DeadTimeCfgTypeDef HRTIM_DeadTimeStructure;
HRTIM_ADCTriggerCfgTypeDef HRTIM_ADCTrigStructure;
NVIC_InitTypeDef NVIC_InitStructure;
// ----------------------------//
// 配置PWM输出GPIO //
// ----------------------------//
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
//--------------HRTIM_CHB1 == PA10; HRTIM_CHB2 == PA11--------------//
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//--------------HRTIM_CHC1 == PB12; HRTIM_CHB2 == PB13--------------//
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_13);//PA10复用
GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_13);//PA11复用
GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_13);//PB12复用
GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_13);//PB13复用
// ----------------------------//
// HRTIM Global initialization //
// ----------------------------//
RCC_HRTIM1CLKConfig(RCC_HRTIM1CLK_PLLCLK);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_HRTIM1, ENABLE);
HRTIM_DLLCalibrationStart(HRTIM1, HRTIM_CALIBRATIONRATE_14);
while(HRTIM_GetCommonFlagStatus(HRTIM1, HRTIM_ISR_DLLRDY) == RESET);
// --------------------------------------------------- //
// HRTIM_TIMERINDEX_MASTER initialization: timer mode and PWM frequency //
// --------------------------------------------------- //
HRTIM_TimerInitStructure.HalfModeEnable = HRTIM_HALFMODE_DISABLED;
HRTIM_TimerInitStructure.StartOnSync = HRTIM_SYNCSTART_DISABLED;
HRTIM_TimerInitStructure.ResetOnSync = HRTIM_SYNCRESET_DISABLED;
HRTIM_TimerInitStructure.DACSynchro = HRTIM_DACSYNC_NONE;
HRTIM_TimerInitStructure.PreloadEnable = HRTIM_PRELOAD_DISABLED; //直接加载
HRTIM_TimerInitStructure.UpdateGating = HRTIM_UPDATEGATING_INDEPENDENT;
HRTIM_TimerInitStructure.BurstMode = HRTIM_TIMERBURSTMODE_MAINTAINCLOCK;
HRTIM_TimerInitStructure.RepetitionUp<ickey>date = HRTIM_UPDATEONREPETITION_ENABLED;
HRTIM_BaseInitStructure.Period = 1152e6 / fsw; // HRTIM周期寄存器, Period = fHRCK / fsw
HRTIM_BaseInitStructure.RepetitionCounter = 7; // 中断频率 = fsw/(8+1)
HRTIM_BaseInitStructure.PrescalerRatio = HRTIM_PRESCALERRATIO_MUL8; //HRTIM时钟倍频系数,1152MHZ
HRTIM_BaseInitStructure.Mode = HRTIM_MODE_CONTINOUS; //HETIM运行在连续模式
HRTIM_Waveform_Init(HRTIM1, HRTIM_TIMERINDEX_MASTER, &HRTIM_BaseInitStructure, &HRTIM_TimerInitStructure);
// --------------------------------------------------- //
// HRTIMx initialization: timer mode and PWM frequency //
// --------------------------------------------------- //
HRTIM_TimerInitStructure.RepetitionTrigger = HRTIM_TIMRESETTRIGGER_MASTER_PER;
HRTIM_TimerWaveStructure.ResetUp<ickey>date = HRTIM_TIMUPDATEONRESET_DISABLED;
HRTIM_TimerWaveStructure.UpdateTrigger = HRTIM_TIMUPDATETRIGGER_MASTER;
HRTIM_WaveformTimerConfig(HRTIM1, HRTIM_TIMERINDEX_TIMER_B, &HRTIM_TimerWaveStructure);
HRTIM_WaveformTimerConfig(HRTIM1, HRTIM_TIMERINDEX_TIMER_C, &HRTIM_TimerWaveStructure);
// -------------------------------- //
// -------HRTIM CHBx 输出配置 ------//
// -------------------------------- //
HRTIM_TIM_OutputStructure.Polarity = HRTIM_OUTPUTPOLARITY_HIGH; //极性控制位:正极性
HRTIM_TIM_OutputStructure.SetSource = HRTIM_OUTPUTRESET_MASTERCMP1; //PWM输出高的触发源:CMP3
HRTIM_TIM_OutputStructure.ResetSource = HRTIM_OUTPUTRESET_MASTERCMP4; //PWM输出低的触发源:CMP2
HRTIM_TIM_OutputStructure.IdleMode = HRTIM_OUTPUTIDLEMODE_NONE; //输出不受空闲状态影响
HRTIM_TIM_OutputStructure.IdleState = HRTIM_OUTPUTIDLESTATE_INACTIVE; //输出不受空闲状态影响
HRTIM_TIM_OutputStructure.FaultState = HRTIM_OUTPUTFAULTSTATE_NONE; //故障状态:PWM输出不受故障影响
HRTIM_TIM_OutputStructure.ChopperModeEnable = HRTIM_OUTPUTCHOPPERMODE_DISABLED; //不使用斩波器
HRTIM_TIM_OutputStructure.BurstModeEntryDelayed = HRTIM_OUTPUTBURSTMODEENTRY_REGULAR; //死区时间不插入空闲状态
HRTIM_WaveformOutputConfig(HRTIM1, HRTIM_TIMERINDEX_TIMER_B, HRTIM_OUTPUT_TB1, &HRTIM_TIM_OutputStructure);
// -------------------------------- //
// -------HRTIM CHCx 输出配置 ------//
// -------------------------------- //
HRTIM_TIM_OutputStructure.Polarity = HRTIM_OUTPUTPOLARITY_HIGH; //极性控制位:正极性
HRTIM_TIM_OutputStructure.SetSource = HRTIM_OUTPUTRESET_MASTERCMP2; //PWM输出高的触发源:CMP1
HRTIM_TIM_OutputStructure.ResetSource = HRTIM_OUTPUTRESET_MASTERCMP3; //PWM输出低的触发源:CMP4
HRTIM_TIM_OutputStructure.IdleMode = HRTIM_OUTPUTIDLEMODE_NONE; //输出不受空闲状态影响
HRTIM_TIM_OutputStructure.IdleState = HRTIM_OUTPUTIDLESTATE_INACTIVE; //输出不受空闲状态影响
HRTIM_TIM_OutputStructure.FaultState = HRTIM_OUTPUTFAULTSTATE_NONE; //故障状态:PWM输出不受故障影响
HRTIM_TIM_OutputStructure.ChopperModeEnable = HRTIM_OUTPUTCHOPPERMODE_DISABLED; //不使用斩波器
HRTIM_TIM_OutputStructure.BurstModeEntryDelayed = HRTIM_OUTPUTBURSTMODEENTRY_REGULAR; //死区时间不插入空闲状态
HRTIM_WaveformOutputConfig(HRTIM1, HRTIM_TIMERINDEX_TIMER_C, HRTIM_OUTPUT_TC1, &HRTIM_TIM_OutputStructure);
HRTIM_MasterSetCompare( HRTIM1, HRTIM_COMPAREUNIT_1, 0.5* HRTIM_BaseInitStructure.Period);
HRTIM_MasterSetCompare( HRTIM1, HRTIM_COMPAREUNIT_4, 0.5* HRTIM_BaseInitStructure.Period);
HRTIM_MasterSetCompare( HRTIM1, HRTIM_COMPAREUNIT_2, 0.5* HRTIM_BaseInitStructure.Period);
HRTIM_MasterSetCompare( HRTIM1, HRTIM_COMPAREUNIT_3, 0.5* HRTIM_BaseInitStructure.Period);
#define DeadTime_Value 120 //死区时间
// -------------------------------- //
// -----HRTIM PWM 死区时间配置 ---- //
// -------------------------------- //
HRTIM_DeadTimeStructure.Prescaler = 0x01;//死区时间预分频器
HRTIM_DeadTimeStructure.FallingLock = HRTIM_TIMDEADTIME_FALLINGLOCK_WRITE;
HRTIM_DeadTimeStructure.FallingSign = HRTIM_TIMDEADTIME_FALLINGSIGN_POSITIVE; //下降沿加死区
HRTIM_DeadTimeStructure.FallingSignLock = HRTIM_TIMDEADTIME_FALLINGSIGNLOCK_WRITE;
HRTIM_DeadTimeStructure.FallingValue = DeadTime_Value;//设定死区时间值
HRTIM_DeadTimeStructure.RisingLock = HRTIM_TIMDEADTIME_RISINGLOCK_WRITE;
HRTIM_DeadTimeStructure.RisingSign = HRTIM_TIMDEADTIME_RISINGSIGN_POSITIVE; //下降沿加死区
HRTIM_DeadTimeStructure.RisingSignLock = HRTIM_TIMDEADTIME_RISINGSIGNLOCK_WRITE;
HRTIM_DeadTimeStructure.RisingValue = DeadTime_Value;//设置上升沿死区时间值
HRTIM_DeadTimeConfig(HRTIM1, HRTIM_TIMERINDEX_TIMER_B, &HRTIM_DeadTimeStructure);
HRTIM_DeadTimeConfig(HRTIM1, HRTIM_TIMERINDEX_TIMER_C, &HRTIM_DeadTimeStructure);
// --------------------------//
// ADC trigger initialization //
// --------------------------//
HRTIM_ADCTrigStructure.Trigger = HRTIM_ADCTRIGGEREVENT13_MASTER_PERIOD;
HRTIM_ADCTrigStructure.UpdateSource = HRTIM_ADCTRIGGERUPDATE_MASTER;
HRTIM_ADCTriggerConfig(HRTIM1, HRTIM_ADCTRIGGER_1, &HRTIM_ADCTrigStructure);
// -------------------------//
// Interrupt initialization //
// -------------------------//
// Configure and enable HRTIM TIMERA interrupt channel in NVIC //
NVIC_InitStructure.NVIC_IRQChannel = HRTIM1_TIMB_IRQn;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// TIMER B issues an interrupt on each repetition event //
HRTIM_ITConfig(HRTIM1, HRTIM_TIMERINDEX_TIMER_B, HRTIM_TIM_IT_REP, ENABLE);
HRTIM_WaveformCounterStart(HRTIM1, HRTIM_TIMERID_TIMER_B);//启动HRTIM PWM模式下的TIMER_A
HRTIM_WaveformCounterStart(HRTIM1, HRTIM_TIMERID_TIMER_C);//启动HRTIM PWM模式下的TIMER_B
HRTIM_WaveformCounterStart(HRTIM1, HRTIM_TIMERID_MASTER );//启动HRTIM PWM模式下的MASTER
DP_PWM_PER = HRTIM1->HRTIM_TIMERx[1].PERxR;
}
```
第一感受是非常的长,下面逐行分解说明
###14到21行 参数定义
分别是GPIO初始化结构体、HRTIM配置结构定义-时基相关参数、定时器配置定义、波形模式初始化参数定义、输出配置定义、死时间特性配置定义、ADC触发器配置定义、NVIC配置定义。
###25到46行 配置GPIO
基本GPIO初始化,配置时钟,引脚复用,相信大家都懂的。
###50、51行 时钟源选择及启动
![HRTIM的两种时钟源](https://IMG_URL_REPLACE/bbsimages/201912/cb9c438a98d11b13944059da691f170d.png "HRTIM的两种时钟源")
RCC的配置,从STM32Cube的截图可以看出HRTIM有两种时钟源,分别是PLLCK和PLLCK二倍频而来的,例程中配置成了二倍频144MHz,不配置成二倍频定时器是不能再倍频的,51行就是开启外设时钟
###52、54行 配置DLL
HRTIM_DLLCalibrationStart(HRTIM1, HRTIM_CALIBRATIONRATE_14);
该函数的功能是启动DLL校准,该选项配置成了周期为14us的定期校准,DLL能保证倍频的精度
54行则为等待DLL校准配置完成
###59-72行 配置MasterTimer
1.强制半波模式关闭
2.启动同步关闭
3.复位同步关闭
4.DAC同步关闭
5.启用直接加载
6.使用独立更新控制
7.计时器计数器维持正常工作
8.启用重复更新
9.设置自动重装载寄存器 1152e6/200e3 = 5760
其中1152e6为144MHz经过8倍频得来的144e6*8=1152e6
10.指定计时器重复周期7+1=8次,8个周期进入一次中断,可以节约单片机资源中断频率为25KHz
11.HRTIM时钟倍频系数,8倍频,1152MHZ
12.HETIM运行在连续模式
初始化主定时器
###77-84行 配置定时器B、C
配置大体与主定时器相同,区别在于将连续模式改成不可重触发的单发模式,使用主定时器进行同步,定时器B、C使用相同的配置
###88-97行 定时器B、C的输出和寄存器更新配置
在同步Buck Boost电路中,PWM的死区时间是非常重要的,MOS不能瞬时开启关闭,有一定的上升时间和下降时间,如果上管和下管的这段时间重叠了就会发送MOS直通,相当于短路,巨大的电流经过MOS,烧毁MOS以及采样电阻,甚至发生危险。
1.死区插入到输出1和输出2之间
2.延时保护失效
3.不使用faut通道
4.计时器故障启用位可读写
5.禁用推挽模式
6.复位触发源为主定时器周期事件
7.关闭寄存器更新
8.更新触发源为主定时器周期时间
定时器B、C的死区配置是一样的
##99-128行 配置定时器B、C的输出模式
大体还是一样的,区别在于两个定时器的SetSource和ResetSource不一样,简单来说就是使用不同的触发源置高置低PWM,并且由于配置了死区控制,TB2和TC2是不用配置的。
1.配置极性高
2.定时器B的置高源为主定时器的比较器1,定时器C的置高源为主定时器的比较器2
3.定时器B的置低源为主定时器的比较器3,定时器C的置低源为主定时器的比较器4
4.输出不受空闲状态影响
5.输出不受空闲状态影响
6.故障状态:PWM输出不受故障影响
7.不使用斩波器
8.死区时间不插入空闲状态
设置主定时器的四个通道为自动重装载值的一半并且软件模拟中间对齐模式,此时PWM为0输出
###132-147行 定时器B、C的死区时间配置
1.死区时间4倍频,源码注释写的是分频器,但是结合标准库和HAL库后发现其实是倍频,标准库将改值左移10位并入HRTIMx->HRTIM_TIMERx[TimerIdx].DTxR寄存器,而HAL库有这个的定义,其中4倍频的操作是相同的。
![死区时间分频HAL库定义](https://IMG_URL_REPLACE/bbsimages/201912/c739869dedfc1347823ef9e54836524e.png "死区时间分频HAL库定义")
2.死区下降值和标志可写
3.下降沿加死区
4.死区下降标志可写
5.设定下降死区时间值为前面的宏定义120
6.死区上升值和标志可写
7.上升沿加死区,估计作者复制粘贴没改(手动滑稽;-)
8.死区上升标志可写
9.设定上升死区时间值为前面的宏定义120
配置定时器B、C为相同的死区配置
###152-154行 ADC触发配置
1.ADC Triggers 1 and 3
2.配置触发源为主定时器更新事件
配置ADC触发源,这样就做到ADC与定时器同步了,200KHz的采样频率
###最后 中断配置,定时器输出使能
配置定时器B中断通道,最高优先级
配置定时器B重复中断
分别启动主定时器,定时器B、C的波形输出
将自动重装载值一半存入DP_PWM_PER备用
到此HRTIM的初始化配置就完成了,下一步进入中断环节
功能体验
安合科技的代码使用标准库编写,代码精炼(虽然注释有点错误),运行效率以及内存占用都比HAL库好,但是意法已经停止对标准库的更新了这在以后可能是个问题,在运算放大器的配置上容易看成程控二倍增益模式,但实际是独立模式
```c
OPAMP_InitStructure.OPAMP_NonInvertingInput = OPAMP_NonInvertingInput_IO4;
OPAMP_InitStructure.OPAMP_InvertingInput = OPAMP_CSR_VMSEL_0;
OPAMP_Init(OPAMP_Selection_OPAMP2, &OPAMP_InitStructure);
OPAMP_PGAConfig(OPAMP_Selection_OPAMP2, OPAMP_OPAMP_PGAGain_2, OPAMP_PGAConnect_IO1);
OPAMP_Cmd(OPAMP_Selection_OPAMP2, ENABLE);
```
使用的引脚为PA5、6、7,与原理图相同。
在比例系数的计算上安合科技好像出了点错误
```c
#define DP_VOLTAGE_IN_RATIO (99.00f/4095) //输入电压比例 3.3*30
#define DP_VOLTAGE_OUT_RATIO (99.00f/4095) //输出电压比例 3.3*30
#define DP_CURRENT_IN_RATIO (22.00f/4095) //输出电流比例 3.3/0.01/15 = 22
#define DP_CURRENT_OUT_RATIO (20.75f/4095) //输出电流比例 3.3/0.01/15 = 22
```
按照原理图,实际测量以及他给出的计算公式输出电流比例应该和输入电流比例相同都是22倍,这次注释没错,代码错了。
之前我一直想要找一种电流检测的方法,要求精度高,最高电流大,小电流敏感,成本低一些的方案,在安合科技的板子上我想我找到了理想的方案,它使用的精密运放只有6块钱,算上半压的比较电压跟随器也可以带3路电流,非常划算,只需要软件消除一下零偏。
程序内定最高电压是48V,而MOS的击穿电压是90V,输出的电压经过二极管返回给10V稳压,稳压IC的耐压是50V,三者构成了一个完美的电压关系
MOS连续漏极电流(Id)(25°C 时)为100A,余量充足,如果换用一个电流更大的电感能将输出功率提升不少
板子的布局大方,看上去有一种美感
3.3V线性稳压前串联一个10欧姆的电阻起到保护作用,保护做的也很齐全
总结
这个数字电源开发板上手感觉就是比较简单,性能也很好,即使没有详细的教程,凭着精简易读的代码也可以轻易上手,提升空间也很高,硬件上也是有很大的升级空间,体验的感觉非常好,就是价格小贵,但是考虑到其开发成本,淘宝420块钱也是非常值得的,淘宝店里还买相关的芯片MOS等元件,价格公平,非常贴心,如果不小心损坏非常容易就能买到原厂元件。
原创作品,未经权利人授权禁止转载。详情见转载须知。