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

📄 mc_stm8s_acim_drive.c

📁 STM8S105 BLDC源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
    //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 + -