📄 pwmd.c
字号:
/** ###################################################################
** THIS BEAN MODULE IS GENERATED BY THE TOOL. DO NOT MODIFY IT.
** Filename : PWMd.C
** Project : che_free
** Processor : MC9S12DG128BCPV
** Beantype : PWM
** Version : Bean 02.112, Driver 01.09, CPU db: 2.87.280
** Compiler : Metrowerks HC12 C Compiler
** Date/Time : 2008-3-16, 上午 09:04
** Abstract :
** This bean implements a pulse-width modulation generator
** that generates signal with variable duty and fixed cycle.
** Settings :
** Used output pin :
** ----------------------------------------------------
** Number (on package) | Name
** ----------------------------------------------------
** 3 | PP1_MOSI1_PWM1_KWP1
** ----------------------------------------------------
**
** Timer name : PWM01 [16-bit]
** Counter : PWMCNT01 [172]
** Mode register : PWMCTL [165]
** Run register : PWME [160]
** Prescaler : PWMPRCLK [163]
** Compare 1 register : PWMPER01 [180]
** Compare 2 register : PWMDTY01 [188]
** Flip-flop 1 register : PWMPOL [161]
**
** User handling procedure : not specified
**
** Output pin
**
** Port name : P
** Bit number (in port) : 1
** Bit mask of the port : 2
** Port data register : PTP [600]
** Port control register : DDRP [602]
**
** Runtime setting period : none
** Runtime setting ratio : calculated
** Initialization:
** Aligned : Left
** Output level : low
** Timer : Enabled
** Event : Enabled
** High speed mode
** Prescaler : divide-by-1
** Clock : 3000000 Hz
** Initial value of period pulse width (ratio 7.5%)
** Xtal ticks : 320000 24000
** microseconds : 20000 1500
** milliseconds : 20 2
** seconds (real) : 0.0200000 0.0015000
**
** Contents :
** SetRatio16 - byte PWMd_SetRatio16(word Ratio);
** SetDutyUS - byte PWMd_SetDutyUS(word Time);
** SetDutyMS - byte PWMd_SetDutyMS(word Time);
**
** (c) Copyright UNIS, spol. s r.o. 1997-2005
** UNIS, spol. s r.o.
** Jundrovska 33
** 624 00 Brno
** Czech Republic
** http : www.processorexpert.com
** mail : info@processorexpert.com
** ###################################################################*/
/* MODULE PWMd. */
#include "PWMd.h"
#pragma DATA_SEG PWMd_DATA
#pragma CODE_SEG PWMd_CODE
static word RatioStore; /* Ratio of L-level to H-level */
/*
** ===================================================================
** Method : SetRatio (bean PWM)
**
** Description :
** The method reconfigures the compare and modulo registers of
** the peripheral(s) when the speed mode changes. The method is
** called automatically as a part of the bean
** SetHigh/SetLow/SetSlow methods.
** This method is internal. It is used by Processor Expert only.
** ===================================================================
*/
static void SetRatio(void)
{
/* PWMDTY01 = (PWMPER01 * (dword)RatioStore + 32768) / 65535; Calculate new value according to the given ratio */
asm {
LDY PWMPER01
LDD RatioStore
EMUL
ADDD #32768
EXG D,Y
ADCB #0
ADCA #0
LDX #65535
EXG D,Y
EDIV
STY PWMDTY01
}
}
/*
** ===================================================================
** Method : PWMd_SetRatio16 (bean PWM)
**
** Description :
** This method sets a new duty-cycle ratio.
** Parameters :
** NAME - DESCRIPTION
** Ratio - Ratio is expressed as an 16-bit unsigned integer
** number. 0 - 65535 value is proportional
** to ratio 0 - 100%
** Note: Calculated duty depends on the timer possibilities
** and on the selected period.
** Returns :
** --- - Error code, possible codes:
** ERR_OK - OK
** ERR_SPEED - This device does not work in
** the active speed mode
** ===================================================================
*/
byte PWMd_SetRatio16(word Ratio)
{
RatioStore = Ratio; /* Store new value of the ratio */
SetRatio(); /* Calculate and set up new appropriate values of the duty and period registers */
return ERR_OK; /* OK */
}
/*
** ===================================================================
** Method : PWMd_SetDutyUS (bean PWM)
**
** Description :
** This method sets the new duty value of the output signal. The
** duty is expressed in microseconds as a 16-bit unsigned integer
** number.
** Parameters :
** NAME - DESCRIPTION
** Time - Duty to set [in microseconds]
** (0 to 20000 us in high speed mode)
** Returns :
** --- - Error code, possible codes:
** ERR_OK - OK
** ERR_SPEED - This device does not work in
** the active speed mode
** ERR_MATH - Overflow during evaluation
** ERR_RANGE - Parameter out of range
** ===================================================================
*/
byte PWMd_SetDutyUS(word Time)
{
dlong rtval; /* Result of two 32-bit numbers multiplication */
if (Time >= 20000) { /* Is the given value out of range? */
return ERR_RANGE; /* If yes then error */
}
PE_Timer_LngMul((dword)Time,(dword)54975581,&rtval); /* Multiply given value and high speed CPU mode coefficient */
if (PE_Timer_LngHi3(rtval[0],rtval[1],&RatioStore)) { /* Is the result greater or equal than 65536 ? */
RatioStore = 65535; /* If yes then use maximal possible value */
}
SetRatio(); /* Calculate and set up new appropriate values of the duty and period registers */
return ERR_OK; /* OK */
}
/*
** ===================================================================
** Method : PWMd_SetDutyMS (bean PWM)
**
** Description :
** This method sets the new duty value of the output signal. The
** duty is expressed in milliseconds as a 16-bit unsigned integer
** number.
** Parameters :
** NAME - DESCRIPTION
** Time - Duty to set [in milliseconds]
** (0 to 20 ms in high speed mode)
** Returns :
** --- - Error code, possible codes:
** ERR_OK - OK
** ERR_SPEED - This device does not work in
** the active speed mode
** ERR_MATH - Overflow during evaluation
** ERR_RANGE - Parameter out of range
** ===================================================================
*/
byte PWMd_SetDutyMS(word Time)
{
dlong rtval; /* Result of two 32-bit numbers multiplication */
if (Time >= 20) { /* Is the given value out of range? */
return ERR_RANGE; /* If yes then error */
}
PE_Timer_LngMul((dword)Time,(dword)214748365,&rtval); /* Multiply given value and high speed CPU mode coefficient */
if (PE_Timer_LngHi2(rtval[0],rtval[1],&RatioStore)) { /* Is the result greater or equal than 65536 ? */
RatioStore = 65535; /* If yes then use maximal possible value */
}
SetRatio(); /* Calculate and set up new appropriate values of the duty and period registers */
return ERR_OK; /* OK */
}
/*
** ===================================================================
** Method : PWMd_Init (bean PWM)
**
** Description :
** Initializes the associated peripheral(s) and the bean's
** internal variables. The method is called automatically as a
** part of the application initialization code.
** This method is internal. It is used by Processor Expert only.
** ===================================================================
*/
void PWMd_Init(void)
{
PWMCNT01 = 0;
RatioStore = 4915; /* Store initial value of the ratio */
PWMDTY01 = 4500; /* Store initial value to the duty-compare register */
PWMPER01 = 60000; /* and to the period register */
/* PWMPRCLK: ??=0,PCKB2=1,PCKB1=0,PCKB0=0,??=0,PCKA2=0,PCKA1=0,PCKA0=0 */
PWMPRCLK = 64; /* Set prescaler register */
/* PWMSCLA: BIT7=0,BIT6=0,BIT5=0,BIT4=0,BIT3=0,BIT2=1,BIT1=0,BIT0=0 */
PWMSCLA = 4; /* Set scale register */
PWMCLK_PCLK1 = 1; /* Select clock source */
PWME_PWME1 = 1; /* Run counter */
}
/* END PWMd. */
/*
** ###################################################################
**
** This file was created by UNIS Processor Expert 2.96 [03.76]
** for the Freescale HCS12 series of microcontrollers.
**
** ###################################################################
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -