<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > STM8 MCKIT1.0 BLDC無(wú)感控制中的采集實(shí)現分析

STM8 MCKIT1.0 BLDC無(wú)感控制中的采集實(shí)現分析

作者: 時(shí)間:2016-11-28 來(lái)源:網(wǎng)絡(luò ) 收藏

ST寫(xiě)的電機庫中,可以用無(wú)感方式驅動(dòng)。芯片只有一個(gè)AD轉換器,而且是8位機。庫中要對反

本文引用地址:http://dyxdggzs.com/article/201611/322715.htm

電勢采集,比較處理,還要進(jìn)行母線(xiàn)電壓,母線(xiàn)電流、散熱片溫度、電位器等模擬信號進(jìn)行采集、運算和處理。

這優(yōu)先級處理說(shuō)起來(lái)是很重要的。不過(guò),ST把程序寫(xiě)的很好,至少我這樣認為。它把不同的任務(wù)放到準確的時(shí)間段里進(jìn)行采集處理。
先把它核心AD采集處理帖出來(lái)再分析 。

#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

上面的代碼我改了一點(diǎn)點(diǎn),就是多采集了一路平均電流。

AD采集分兩種,一個(gè)是同步,一個(gè)是異步。同步中有三個(gè)采集通道,異步中有三個(gè)采集通道。同步中的通道為反電勢通道、瞬時(shí)電流、平均電流。異步采集中通道為母線(xiàn)電壓、溫度值、電位器。

異步采集是在同步完成后進(jìn)行的。同步采集是通過(guò)TIM1的通道4觸發(fā)采集。

所以每個(gè)PWM周期采集2路模擬信號。異步采集的通道與PWM的ON與OFF狀態(tài)無(wú)關(guān),所以安排在異步采集中。同步采集中的反電勢需要在PWM固定時(shí)刻采集,或ON或OFF,看BEMF的過(guò)零比較方案。瞬時(shí)電流一般在TON時(shí)刻采集。因為原來(lái)ST有PWM特殊時(shí)刻做了一路用戶(hù)通道中,所以我就把平均電流加到這一通道上了。其實(shí)平均電流采集也可以放到異步中。無(wú)所謂了,功能實(shí)現是沒(méi)問(wèn)題的。

另外,異步采集中的反電勢通道一直是設為浮空相的通道的。而且反電勢的采集在D與Z之間,即退磁結束與過(guò)零點(diǎn)之間進(jìn)行的異步采集均為反電勢,而瞬時(shí)電流的采集是在Z與C之間,即過(guò)零與換相之間進(jìn)行的異步采集均為瞬時(shí)瞬時(shí)電流。所以用戶(hù)的通道(平均電流)就是在換相與退磁之間了。

ST的無(wú)感方案,啟動(dòng)方案感覺(jué)只能針對工業(yè)用電機,像在4極對下4K轉速的電機,那啟動(dòng)參數不用怎么改。但如果改為航模電機,無(wú)論啟動(dòng)PWM改為多少,總是不能啟動(dòng)成功??赡苁俏疫€找到巧門(mén),也可能沒(méi)設對參數,對于高速電機,像這種無(wú)感啟動(dòng)可能是升頻升壓法啟動(dòng)才可靠。我早期寫(xiě)的例程,無(wú)論什么電機,用的是升頻升壓法,無(wú)論什么電機,都可以正常啟動(dòng),只是啟動(dòng)過(guò)程(大約1S)電流從大到小,,至少正常運行至最小電流值。



關(guān)鍵詞: STM8 無(wú)感控制 BLDC

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>