📄 mc_stm8s_acim_drive.c
字号:
//ADC2_StartConversion();
ADC2->CR1 |= ADC2_CR1_ADON;
}
if (hBusRepRate == 0)
#ifdef BUS_VOLTAGE_MEASUREMENT
{
hBusRepRate = BUSCONVERSION_REPRATE;
//u16 ADC2_GetConversionValue(void) , /* Left alignment */
/* Read MSB only, so as to have an 8 bit conversion*/
bBusVolt_Buffer[bBusVolt_Buffer_Index] = BusNode.Conversion;
bBusVolt_Buffer_Index++;
if (bBusVolt_Buffer_Index == BUSVOLT_BUFFER_SIZE)
{
u8 i;
u16 htemp=0;
bBusVolt_Buffer_Index = 0;
for (i=0;i<BUSVOLT_BUFFER_SIZE;i++)
{
htemp += bBusVolt_Buffer[i];
}
htemp /= BUSVOLT_BUFFER_SIZE;
*pBusVoltage = htemp;
}
}
#else
{
hBusRepRate = BUSCONVERSION_REPRATE;
*pBusVoltage = BUS_VOLTAGE_VALUE8;
}
#endif
if (hHeatSinkRepRate == 0)
{
hHeatSinkRepRate = HEATSINK_REPRATE;
#ifdef HEAT_SINK_TEMPERATURE_MEASUREMENT
*pHeatsinkTemp = HeatNode.Conversion;
#else
*pHeatsinkTemp = HEAT_SINK_TEMPERATURE_TEMP8;
#endif
if (*pHeatsinkTemp > MAX_HEATSINK_TEMP8)
{
*(pReg16+VDEV_REG16_HW_ERROR_OCCURRED) |= HEATSINK_TEMPERATURE;
*(pReg16+VDEV_REG16_HW_ERROR_ACTUAL) |= HEATSINK_TEMPERATURE;
}
else if (*pHeatsinkTemp < MIN_HEATSINK_TEMP8)
{
*(pReg16+VDEV_REG16_HW_ERROR_ACTUAL) &= (u8)(~HEATSINK_TEMPERATURE);
}
}
if (hUserADCRepRate == 0)
{
hUserADCRepRate = USERADC_REPRATE;
pACIM_Motor->pACIM_Var->hUserADC = UserNode.Conversion;
}
//TIM1_ClearITPendingBit(TIM1_IT_UPDATE);
TIM1->SR1 = (u8)(~(u8)TIM1_IT_UPDATE);
}
//else if (TIM1_GetITStatus(TIM1_IT_BREAK)==SET)
else if ((TIM1->SR1 & (u8)TIM1_IT_BREAK) != 0)
{
if ((*(pReg16+VDEV_REG16_HW_ERROR_OCCURRED) & BUS_UNDERVOLTAGE) == 0)
{
*(pReg16+VDEV_REG16_HW_ERROR_OCCURRED) |= OVER_CURRENT;
}
//TIM1_ClearITPendingBit(TIM1_IT_BREAK);
TIM1->SR1 = (u8)(~(u8)TIM1_IT_BREAK);
}
return;
}
/**
* @brief ADC2 interrupt routine.
* @par Parameters:
* None
* @retval void None
* @par Required preconditions:
* None
* @par Called functions:
* None
*/
@near @interrupt void ADC2_IRQHandler (void)
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
//if (TIM1_GetITStatus(TIM1_IT_CC4) !=0)
if ((TIM1->SR1 & (u8)TIM1_IT_CC4) != 0)
{
//TIM1_ClearFlag(TIM1_FLAG_CC4);
TIM1->SR1 = (u8)(~(u8)(TIM1_FLAG_CC4)); //overcapture flag is not cleared
if (pADCNode->Signal == ADC_BUS)
{
#ifdef BUS_VOLTAGE_MEASUREMENT
bBusVoltage = ADC2->DRH;
#endif
bRepCnt -= 2;
if (bRepCnt == 1)
{
#if (!defined BUS_VOLTAGE_MEASUREMENT)
bSineMag8 = SineMag;
#elif defined BUS_VOLTAGE_MEASUREMENT
bBusTemp = (u8)(*pBusVoltage);
// Bus voltage compensation, uncomment the asm code below
//hSineMag16 = (SineMag * (*pBusVoltage))/bBusVoltage;
#asm
clr a
ld a,_SineMag
ldw x,_bBusTemp
swapw x
mul x,a
ld a,_bBusVoltage
div x,a
ldw _hSineMag16,x
#endasm
if (hSineMag16 > pACIM_Motor->pACIM_Const->bPWM_Timer_MMI)
{
hSineMag16 = pACIM_Motor->pACIM_Const->bPWM_Timer_MMI;
}
bSineMag8 = (u8)(hSineMag16);
// No bus voltage compensation, uncomment the line below
// bSineMag8 = SineMag;
#endif
//3phase sinewaves generation
#asm
;Phase += SineFreq;
ldw Y,_Phase
addw Y,_SineFreq
ldw _Phase,Y
;Y = Phase>>8
clr A
swapw Y
ld YH,A ;YL hold LUT pointer
;********************* PHASE U duty cycle processing ***************************
ld A,(_SINE3RDHARM,Y) ; Get entry from table
ldw X,_bSineMag8 ; Scale According to SineMag
swapw X
mul X,A ; 16-bit Result in X
btjt _Phase,#7,nextU ; Phase represents offset in LUT
; jmp if entry is positive, first half of table
cplw X ; Otherwise negate result
incw X ; Increase MSB if 2_s complement of A is 100
nextU:
sraw X
sraw X
sraw X
sraw X
sraw X
sraw X
sraw X
swapw X
ld A,XH
add A,_bOffset
jrnc cond1
incw X
cond1: ld XH,A
ld A,XL
ld 0x5265,A ;TIM1->CCR1H
ld A,XH
ld 0x5266,A ;TIM1->CCR1L
;********************* PHASE V duty cycle processing ***************************
ld A, YL
add A,_PhaseShiftB
ld YL, A
ld A,(_SINE3RDHARM,Y) ; Get entry from table
ldw X,_bSineMag8 ; Scale According to SineMag
swapw X
mul X,A ; 16-bit Result in X
ld A, YL
tnz A
jrmi nextV
cplw X ; Otherwise negate result
incw X ; Increase MSB if 2_s complement of A is 100
nextV:
sraw X
sraw X
sraw X
sraw X
sraw X
sraw X
sraw X
swapw X
ld A,XH
add A,_bOffset
jrnc cond2
incw X
cond2: ld XH,A
ld A,XL
ld 0x5267,A ;TIM2->CCR1H
ld A,XH
ld 0x5268,A ;TIM2->CCR1L
;********************* PHASE W duty cycle processing ***************************
ld A, YL
add A,_PhaseShiftC
ld YL, A
ld A,(_SINE3RDHARM,Y) ; Get entry from table
ldw X,_bSineMag8 ; Scale According to SineMag
swapw X
mul X,A ; 16-bit Result in X
ld A, YL
tnz A
jrmi nextW
cplw X ; Otherwise negate result
incw X ; Increase MSB if 2_s complement of A is 100
nextW:
sraw X
sraw X
sraw X
sraw X
sraw X
sraw X
sraw X
swapw X
ld A,XH
add A,_bOffset
jrnc cond3
incw X
cond3: ld XH,A
ld A,XL
ld 0x5269,A ;TIM3->CCR1H
ld A,XH
ld 0x526A,A ;TIM3->CCR1L
#endasm
}
//error check
#ifdef BUS_VOLTAGE_MEASUREMENT
pADCNode->Conversion = bBusVoltage;
if (bBusVoltage > MAX_BUS_VOLTAGE8)
{
#ifdef DISSIPATIVE_BRAKE
#if (DISSIPATIVE_BRAKE_POL == DISSIPATIVE_BRAKE_ACTIVE_HIGH)
DISSIPATIVE_BRAKE_PORT->ODR |= DISSIPATIVE_BRAKE_BIT;
#else
DISSIPATIVE_BRAKE_PORT->ODR &= (u8)(~DISSIPATIVE_BRAKE_BIT);
#endif
#else
*(pReg16+VDEV_REG16_HW_ERROR_OCCURRED) |= BUS_OVERVOLTAGE;
*(pReg16+VDEV_REG16_HW_ERROR_ACTUAL) |= BUS_OVERVOLTAGE;
#endif
}
#ifdef DISSIPATIVE_BRAKE
else if (bBusVoltage < BRAKE_HYSTERESIS8)
{
#if (DISSIPATIVE_BRAKE_POL == DISSIPATIVE_BRAKE_ACTIVE_HIGH)
DISSIPATIVE_BRAKE_PORT->ODR &= (u8)(~DISSIPATIVE_BRAKE_BIT);
#else
DISSIPATIVE_BRAKE_PORT->ODR |= DISSIPATIVE_BRAKE_BIT;
#endif
}
#else
else
{
*(pReg16+VDEV_REG16_HW_ERROR_ACTUAL) &= (u8)(~BUS_OVERVOLTAGE);
}
#endif
if (bBusVoltage < MIN_BUS_VOLTAGE8)
{
*(pReg16+VDEV_REG16_HW_ERROR_OCCURRED) |= BUS_UNDERVOLTAGE;
*(pReg16+VDEV_REG16_HW_ERROR_ACTUAL) |= BUS_UNDERVOLTAGE;
}
else
{
*(pReg16+VDEV_REG16_HW_ERROR_ACTUAL) &= (u8)(~BUS_UNDERVOLTAGE);
}
#endif
}
else
{
pADCNode = &BusNode;//error, bad synchronization; re-synchronize
pADCNode->NextSignal = &BusNode;
hBusRepRate = BUSCONVERSION_REPRATE;
hHeatSinkRepRate = HEATSINK_REPRATE;
hUserADCRepRate = USERADC_REPRATE;
}
}
else //Asynch ADCs management
{
pADCNode->Conversion = ADC2->DRH;
pADCNode = pADCNode->NextSignal;
/* Clear the ADC2 channels */
ADC2->CSR &= (u8)(~ADC2_CSR_CH);
/* Select the ADC2 channel */
ADC2->CSR |= (u8)(pADCNode->Channel);
if (pADCNode->Signal != ADC_BUS)
{
//Start single conversion
//ADC2_StartConversion();
ADC2->CR1 |= ADC2_CR1_ADON;
}
}
//ADC2_ClearITPendingBit();
ADC2->CSR &= (u8)(~ADC2_CSR_EOC);
return;
}
/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -