您的位置 首页 动态

STM8 MCKIT1.0 BLDC无感操控中的收集完成剖析

ST写的STM8电机库中,可以用无感方式驱动BLDC。STM8芯片只有一个AD转换器,而且是8位机。库中要对反电势采集,比较处理,还要进行母线电压

ST写的STM8电机库中,能够用无感方法驱动BLDC。STM8芯片只要一个AD转换器,并且是8位机。库中要对反

电势收集,比较处理,还要进行母线电压,母线电流、散热片温度、电位器等模拟信号进行收集、运算和处理。

这优先级处理说起来是很重要的。不过,ST把程序写的很好,至少我这样以为。它把不同的使命放到精确的时间段里进行收集处理。
先把它中心AD收集处理帖出来再剖析 。

#ifdef SENSORLESS
@near @interrupt @svlreg void ADC2_IRQHandler (void)
{
if (ADC_State == ADC_SYNC)
{
// Syncronous sampling

u16 data;
u8 delay;
u16 bemf_threshold;

// Reset bit
bComHanderEnable = 0;

//clear interrupt flag
ADC2->CSR &= (u8)(~BIT7);

//left align – read DRH first
data = ADC2->DRH;
data <<= 2;
data |= (ADC2->DRL & 0x03);

switch( ADC_Sync_State )
{
case ADC_BEMF_INIT:
ADC2->CSR = (u8)((Current_BEMF_Channel|BIT5));
BEMF_Sample_Debounce = 0;
Zero_Sample_Count = 0;
ADC_Sync_State = ADC_BEMF_SAMPLE;
SetSamplingPoint_BEMF();
break;

case ADC_BEMF_SAMPLE:
//detect zero crossing
if( Current_BEMF == BEMF_FALLING )
{
if( Z_Detection_Type == Z_DETECT_PWM_OFF )
{
bemf_threshold = BEMF_FALLING_THRESHOLD;
}
else
{
bemf_threshold = hNeutralPoint;
}

if (Ramp_Step > FORCED_STATUP_STEPS)
{
if( data <bemf_threshold)
{
Zero_Sample_Count++;
BEMF_Sample_Debounce++;
if( BEMF_Sample_Debounce >= BEMF_SAMPLE_COUNT )
{
hTim3Th -= hTim3Cnt;
GetStepTime();

SpeedMeasurement();

bComHanderEnable = 1;

BEMF_Sample_Debounce = 0;
}
}
else
{
BEMF_Sample_Debounce = 0;
}
}
}
else
{
if( Z_Detection_Type == Z_DETECT_PWM_OFF )
{
bemf_threshold = BEMF_RISING_THRESHOLD;
}
else
{
bemf_threshold = hNeutralPoint;
}

if (Ramp_Step > FORCED_STATUP_STEPS)
{
if( data > bemf_threshold )
{
Zero_Sample_Count++;
BEMF_Sample_Debounce++;
if( BEMF_Sample_Debounce >= BEMF_SAMPLE_COUNT )
{
hTim3Th -= hTim3Cnt;
GetStepTime();

SpeedMeasurement();

bComHanderEnable = 1;

BEMF_Sample_Debounce = 0;
}
}
else
{
BEMF_Sample_Debounce = 0;
}
}
}
break;

case ADC_CURRENT_INIT:
ADC2->CSR = (ADC_CURRENT_CHANNEL|BIT5);
ADC_Sync_State = ADC_CURRENT_SAMPLE;
SetSamplingPoint_Current();
break;

default:
case ADC_AVCURRENT_INIT:
ADC2->CSR = (ADC_AVCURRENT_CHANNEL|BIT5);
ADC_Sync_State = ADC_AVCURRENT_CHANNEL;// ADC_USER_SYNC_SAMPLE;
SetSamplingPoint_AVCURRENT();
break;


case ADC_CURRENT_SAMPLE:
ADC_Buffer[ ADC_CURRENT_INDEX ] = data;
break;

case ADC_AVCURRENT_SAMPLE:
ADC_Buffer[ ADC_AVCURRENT_INDEX] = data;
break;
}

// Store the current channel selected
bCSR_Tmp = ADC2->CSR;

// Set the Async sampling channel
switch (ADC_Async_State)
{
default:
case ADC_BUS_INIT:
ADC2->CSR = (ADC_BUS_CHANNEL|BIT5);
ADC_Async_State = ADC_BUS_SAMPLE;
break;

case ADC_TEMP_INIT:
ADC2->CSR = (ADC_TEMP_CHANNEL|BIT5);
ADC_Async_State = ADC_TEMP_SAMPLE;
break;

case ADC_USER_ASYNC_INIT:
ADC2->CSR = (ADC_USER_ASYNC_CHANNEL|BIT5);
ADC_Async_State = ADC_USER_ASYNC_SAMPLE;
break;
}

// Disable ext. trigger
ADC2->CR2 &= (u8)(~BIT6);
//Start ADC sample
ADC2->CR1 |= BIT0;

ADC_State = ADC_ASYNC;

if (bComHanderEnable == 1)
{
ComHandler();
}
}
else
{
// Syncronous sampling
u16 data;

data = ADC2->DRH;
data <<= 2;
data |= (ADC2->DRL & 0x03);

//clear interrupt flag
ADC2->CSR &= (u8)(~BIT7);

// Restore the sync ADC channel
ADC2->CSR = bCSR_Tmp;

// Enable ext. trigger
ADC2->CR2 |= BIT6;

// Manage async sampling
switch (ADC_Async_State)
{
default:
case ADC_BUS_SAMPLE:
ADC_Buffer[ ADC_BUS_INDEX ] = data;
ADC_Async_State = ADC_TEMP_INIT;
break;

case ADC_TEMP_SAMPLE:
ADC_Buffer[ ADC_TEMP_INDEX ] = data;
ADC_Async_State = ADC_USER_ASYNC_INIT;
break;

case ADC_USER_ASYNC_SAMPLE:
ADC_Buffer[ ADC_USER_ASYNC_INDEX ] = data;
ADC_Async_State = ADC_BUS_INIT;
break;
}

ADC_State = ADC_SYNC;
}
}
#endif

上面的代码我改了一点点,便是多收集了一路均匀电流。

AD收集分两种,一个是同步,一个是异步。同步中有三个收集通道,异步中有三个收集通道。同步中的通道为反电势通道、瞬时电流、均匀电流。异步收会集通道为母线电压、温度值、电位器。

异步收集是在同步完成后进行的。同步收集是经过TIM1的通道4触发收集。

所以每个PWM周期收集2路模拟信号。异步收集的通道与PWM的ON与OFF状况无关,所以安排在异步收会集。同步收会集的反电势需要在PWM固定时间收集,或ON或OFF,看BEMF的过零比较计划。瞬时电流一般在TON时间收集。由于本来ST有PWM特别时间做了一路用户通道中,所以我就把均匀电流加到这一通道上了。其实均匀电流收集也能够放到异步中。无所谓了,功用实现是没问题的。

别的,异步收会集的反电势通道一直是设为浮空相的通道的。并且反电势的收集在D与Z之间,即退磁完毕与过零点之间进行的异步收集均为反电势,而瞬时电流的收集是在Z与C之间,即过零与换相之间进行的异步收集均为瞬时瞬时电流。所以用户的通道(均匀电流)便是在换相与退磁之间了。

ST的无感计划,发动计划感觉只能针对工业用电机,像在4极对下4K转速的电机,那发动参数不必怎么改。但假如改为航模电机,不管发动PWM改为多少,总是不能发动成功。或许是我还找到巧门,也或许没设对参数,关于高速电机,像这种无感发动或许是升频升压法发动才牢靠。我前期写的例程,不管什么电机,用的是升频升压法,不管什么电机,都能够正常发动,仅仅发动进程(大约1S)电流从大到小,,至少正常运行至最小电流值。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/dongtai/255974.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部