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

📄 pwm_sfcn_9s12.tlc

📁 simulink real-time workshop for dragon12 development board from
💻 TLC
字号:
%% File : pwm_sfcn_9S12.tlc
%%
%% Description: 
%%   PWM device driver for the MC9S12DP256B/C
%%
%% fw-03-05
%%
%implements  pwm_sfcn_9S12 "C"


%% add required include files... -- fw-03-05
%<LibAddToCommonIncludes("<mc9s12dp256.h>")>
%<LibAddToCommonIncludes("tmwtypes.h")>


%% Function: Start ==========================================================
%%
%% Purpose:
%%      PWM initialization code.
%%
%% === Parameters ===
%% P1 -- sampletime   (real_T)
%% P2 -- PMW period   (real_T)
%% P3 -- Pulse pin    (real_T)
%% P4 -- Sign port    (real_T)
%% P5 -- Sign pin     (real_T)
%% P6 -- Vsat         (real_T)
%% P7 -- Mon          (real_T)
%%
%% === RTWdata ===
%% 'pulsepinStr'      ('0' - '7')
%% 'pulsepinMask'
%% 'signportStr'
%% 'signportddrStr'
%% 'signpinMask'
%% 'signpinStr'
%% 'resolution'       (8 : 8-bit   16 : 16-bit)
%% 'CLKselect'        (0 : A, SA    1 : B, SB)
%% 'useSCL'           (0 : A, B     1 : SA, SB)
%% 'PCKStr'           ('0' - '7')
%% 'PWMSCLStr'        ('0' - '255')
%% 'PERIODStr'        ('0' - '255' or '0' - '65535')
%%

%function Start(block, system) Output

  /* S-Function "pwm_sfcn_9S12" Block: %<Name> */

  %assign channel = %<block.RTWdata.pulsepinStr>
  %assign channelMask = %<block.RTWdata.pulsepinMask>
  %assign signpinMask = %<block.RTWdata.signpinMask>
  %assign PCK = %<block.RTWdata.PCKStr>
  %assign SCL = %<block.RTWdata.PWMSCLStr>
  %assign CLKselect = %<block.RTWdata.CLKselectStr>
  %%assign useSCL = %<block.RTWdata.useSCLStr>
  %assign resolution = %<block.RTWdata.resolutionStr>
  %assign PERIOD = %<block.RTWdata.PERIODStr>


  %% configure PWM clock generators (A / B)
  %%
  %if CLKselect == 0
     %assign PCKVal = %<CAST("Number", PCK)>
     %%
     #ifndef INIT_PWM_CLOCK_A
	 #define INIT_PWM_CLOCK_A 
     /* Configure PWM clock A */
     PWMSCLA = %<SCL>;			/* scaler value SA (common to all 'A' channels) */
     PWMPRCLK &= 0xF0;
     PWMPRCLK |= %<PCKVal>;		/* prescaler value for clock A, common */
	 #endif /* INIT_PWM_CLOCK_A */
  %else
     %% Bitshift prescaler B left 4 bits -- upper nibble
     %assign PCK = FEVAL("bitshift", %<PCK>, 4)
     %assign PCKVal  = %<CAST("Number", PCK)>
     %%
     /* Configure PWM clock B */
     #ifndef INIT_PWM_CLOCK_B
	 #define INIT_PWM_CLOCK_B 
     PWMSCLB = %<SCL>;			/* scaler value SB (common to all 'B' channels) */
     PWMPRCLK &= 0x0F;
     PWMPRCLK |= %<PCKVal>;		/* prescaler value for clock B, common */
	 #endif /* INIT_PWM_CLOCK_B */
  %endif

  
  %% Set 'scaled clock' bit - always
  %%
  %if CLKselect == 0
	/* Set PWM 'scaled clock' bit (use SA clock) */
    PWMCLK |= %<channelMask>;	/* channel %<channel> uses scaled clock (SA) */
  %else
	/* Set PWM 'scaled clock' bit (use SB clock) */
    PWMCLK |= %<channelMask>;	/* channel %<channel> uses scaled clock (SB) */
   %endif

  %% Set initial polarity bit
  %%
  /* Set PWM initial polarity bit to '1' */
  PWMPOL |= %<channelMask>;


  %% Set PWM control register and PWM period register
  %%
  %assign PERIODreal = LibBlockParameterValue(P2, 0)
  %%
  %if resolution == 16
    %switch(channel)
    %case 1
      /* cascading channels 0 & 1 */
      PWMCTL |= 0x18;
	  
	  /* set period register (%<PERIODreal> seconds) */
	  PWMPER01 = %<PERIOD>;
	%break
    %case 3
      /* cascading channels 2 & 3 */
      PWMCTL |= 0x28;
	  
	  /* set period register (%<PERIODreal> seconds) */
	  PWMPER23 = %<PERIOD>;
	%break
    %case 5
      /* cascading channels 4 & 5 */
      PWMCTL |= 0x48;
	  
	  /* set period register (%<PERIODreal> seconds) */
	  PWMPER45 = %<PERIOD>;
	%break
    %case 7
      /* cascading channels 6 & 7 */
      PWMCTL |= 0x88;
	  
	  /* set period register (%<PERIODreal> seconds) */
	  PWMPER67 = %<PERIOD>;
    %endswitch
  %else
    %switch(channel)
    %case 1
      /* ensure separately controlled channels */
      PWMCTL &= ~0x10;
	  
      /* set period register (%<PERIODreal> seconds) */
      PWMPER%<channel> = %<PERIOD>;
	%break
    %case 3
      /* ensure separately controlled channels */
      PWMCTL &= ~0x20;
	  
      /* set period register (%<PERIODreal> seconds) */
      PWMPER%<channel> = %<PERIOD>;
	%break
    %case 5
      /* ensure separately controlled channels */
      PWMCTL &= ~0x40;
	  
      /* set period register (%<PERIODreal> seconds) */
      PWMPER%<channel> = %<PERIOD>;
	%break
    %case 7
      /* ensure separately controlled channels */
      PWMCTL &= ~0x80;
	  
      /* set period register (%<PERIODreal> seconds) */
      PWMPER%<channel> = %<PERIOD>;
    %endswitch
  %endif
  
  
  %% Set initial polarity bit
  %%
  /* set chosen sign pin as output  */
  %<block.RTWdata.signportddrStr> |= %<signpinMask>;
  
  
  
  %% Read input and store value in RWork vector
  %%
  %assign u = LibBlockInputSignal(0, "", "", 0)
  /* initialize RWork with an 'impossible' input value -- this enables mdlOutput to run */
  %<LibBlockRWork("", "", "", 0)> = -1234.5678;


%endfunction


%% Function: Outputs ==========================================================
%%
%% Purpose:
%%      PWM initialization code.
%%
%function Outputs(block, system) Output

  %assign channel = %<block.RTWdata.pulsepinStr>
  %assign channelMask = %<block.RTWdata.pulsepinMask>

   /* S-Function "pwm_sfcn_9S12" Block: %<Name> 
    *
    * Set PWM duty cycle whenever the input signal "u" changes
    */
	{
		
		real_T	u;
		
		%assign u = LibBlockInputSignal(0, "", "", 0)
		%assign uOld = LibBlockRWork("", "", "", 0)
		%assign duty = LibBlockIWork("", "", "", 0)
		%assign signPinMask = %<block.RTWdata.signpinMask>
		%assign period = %<block.RTWdata.PERIODStr>
		%assign Vsat = LibBlockParameter(P6, "", "", 0)
		%%
		/* get input value */
		u = %<u>;
		
		/* only update unit if the input voltage 'u' has changed */
		if(u != %<uOld>) {
		
			/* retain current input value for the next time round... */
			%<uOld> = u;
			
			/* check polarity of input voltage */
			if (u < 0) {
				
				/* negative inputs : set sign pin */
				%<block.RTWdata.signportStr> |= %<signPinMask>;
				%%
				/* invert the copy of input signal */
				u = -u;
				
			} else {
				
				/* positive inputs : clear sign pin */
				%<block.RTWdata.signportStr> &= ~%<signPinMask>;
				
			}
			
			/* limit input voltage to the specified maximum (Vsat) */
			if(u > %<Vsat>) {
				
				u = %<Vsat>;
				
			}
			
			/* new duty cycle (store in IWork[0]) */
			%<duty> = (uint_T)(u/%<Vsat> * %<period>);
			
			%% Set PWM control register and PWM duty cycle register
			%%
			%assign PERIODreal = LibBlockParameterValue(P2, 0)
			%assign resolution = %<block.RTWdata.resolutionStr>
			%assign channel = %<block.RTWdata.pulsepinStr>
			%%
			%if resolution == 16
			  %switch(channel)
			  %case 1
				/* duty cycle channels 0 & 1 (fraction of %<PERIODreal> seconds) */
				PWMDTY01 = %<duty>;
			  %break
			  %case 3
				/* duty cycle channels 2 & 3 (fraction of %<PERIODreal> seconds) */
				PWMDTY23 = %<duty>;
			  %break
			  %case 5
				/* duty cycle channels 4 & 5 (fraction of %<PERIODreal> seconds) */
				PWMDTY45 = %<duty>;
			  %break
			  %case 7
				/* duty cycle channels 6 & 7 (fraction of %<PERIODreal> seconds) */
				PWMDTY67 = %<duty>;
			  %endswitch
			%else
				/* duty cycle channel %<channel> (fraction of %<PERIODreal> seconds) */
				PWMDTY%<channel> = %<duty>;
			%endif
			
		} /* if(u != _u) */
		
		
		%assign MON = %<CAST( "Number", LibBlockParameterValue(P7, 1) )>
		%%
		%if (MON == 1)
			
			%assign y = LibBlockOutputSignal(0, "", "", 0)
			%%
			/* monitor pulse pin (high: 1.0, low: 0.0) */
			%if resolution == 16
			  %switch(channel)
			   %case 1
				if(PWMCNT01 < %<duty>)	%<y> = 1.0;
				else		            %<y> = 0.0;
			    %break
			   %case 3
				if(PWMCNT23 < %<duty>)	%<y> = 1.0;
				else		            %<y> = 0.0;
			    %break
			   %case 5
				if(PWMCNT45 < %<duty>)	%<y> = 1.0;
				else		            %<y> = 0.0;
			    %break
			   %case 7
				if(PWMCNT67 < %<duty>)	%<y> = 1.0;
				else		            %<y> = 0.0;
			  %endswitch
			%else
				if(PWMCNT%<channel> < %<duty>)	%<y> = 1.0;
				else		       			    %<y> = 0.0;
			%endif
			
		%endif
		
	} /* S-Function "pwm_sfcn_9S12" Block: %<Name> */
	
    /* enable PWM channel %<channel> */ 
    PWME |= %<channelMask>;
    
%endfunction


%% Function: Terminate ==========================================================
%%
%% Purpose:
%%      Code generation rules for mdlTerminate function.
%%
%function Terminate(block, system) Output

	%assign channel = %<block.RTWdata.pulsepinStr>
	%assign channelMask = %<block.RTWdata.pulsepinMask>
	
    /* disable PWM channel %<channel> */ 
    PWME &= ~%<channelMask>;
  
%endfunction


%% [EOF] pwm_sfcn_9S12.tlc

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -