251 lines
5.5 KiB
C
251 lines
5.5 KiB
C
|
#include "pwm.h"
|
|||
|
#include "gpio.h"
|
|||
|
#include "debug.h"
|
|||
|
|
|||
|
//static PWM_CTRL_TYPE * PWM_0_CTRL = ((PWM_CTRL_TYPE *) PWM_0_CTRL_BASE);
|
|||
|
//static PWM_CTRL_TYPE * PWM_1_CTRL = ((PWM_CTRL_TYPE *) PWM_1_CTRL_BASE);
|
|||
|
//static PWM_CTRL_TYPE * PWM_2_CTRL = ((PWM_CTRL_TYPE *) PWM_2_CTRL_BASE);
|
|||
|
//static HPWM_CTRL_TYPE * HPWM_CTRL = ((HPWM_CTRL_TYPE *) HPWM_CTRL_BASE);
|
|||
|
|
|||
|
#define PWM_0_CTRL ((PWM_CTRL_TYPE *)PWM_0_CTRL_BASE)
|
|||
|
#define PWM_1_CTRL ((PWM_CTRL_TYPE *)PWM_1_CTRL_BASE)
|
|||
|
#define PWM_2_CTRL ((PWM_CTRL_TYPE *)PWM_2_CTRL_BASE)
|
|||
|
#define HPWM_CTRL ((HPWM_CTRL_TYPE *)HPWM_CTRL_BASE)
|
|||
|
|
|||
|
/*
|
|||
|
pwm0 <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: PWM_x pwm_x Ҫ<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>pwmģ<EFBFBD><EFBFBD> <EFBFBD>μ<EFBFBD>PWM_MODEö<EFBFBD><EFBFBD>
|
|||
|
PWM_PARAMETER pwm_parameter pwm<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>μ<EFBFBD>PWM_PARAMETER<EFBFBD>ṹ<EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
PWM_PARAMETER pwm_parameter;
|
|||
|
//Flash mode
|
|||
|
pwm_parameter.MODE=flash_mode;
|
|||
|
pwm_parameter.T1=0x10; //16 * 1/32=0.5s ʵ<><CAB5>0.768563250
|
|||
|
pwm_parameter.T2=0x20; //32 * 1/32=1s ʵ<><CAB5>1.585201375
|
|||
|
pwm_parameter.T3=0x0000;
|
|||
|
pwm_parameter.N1=0x80; //<2F><><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>û<EFBFBD><C3BB>T3
|
|||
|
pwm_parameter.N2=0x80; //<2F><><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD>
|
|||
|
pwm_enable(PWM_0,pwm_parameter);
|
|||
|
*/
|
|||
|
void pwm_enable(PWM_x pwm_x,PWM_PARAMETER pwm_parameter)
|
|||
|
{
|
|||
|
PWM_CTRL_TYPE * PWM_CTRL = 0;
|
|||
|
switch(pwm_x)
|
|||
|
{
|
|||
|
case PWM_0:
|
|||
|
PWM_CTRL = PWM_0_CTRL;
|
|||
|
break;
|
|||
|
case PWM_1:
|
|||
|
PWM_CTRL = PWM_1_CTRL;
|
|||
|
break;
|
|||
|
default:
|
|||
|
PWM_CTRL = PWM_2_CTRL;
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
PWM_CTRL->MODE= pwm_parameter.MODE;
|
|||
|
switch(pwm_parameter.MODE)
|
|||
|
{
|
|||
|
case pwm_mode:
|
|||
|
PWM_CTRL->PWM_M = pwm_parameter.PWM_M;
|
|||
|
PWM_CTRL->PWM_N = pwm_parameter.PWM_N;
|
|||
|
break;
|
|||
|
case flash_mode:
|
|||
|
PWM_CTRL->T1 = pwm_parameter.T1;
|
|||
|
PWM_CTRL->T2 = pwm_parameter.T2;
|
|||
|
PWM_CTRL->T3 = pwm_parameter.T3;
|
|||
|
PWM_CTRL->N1 = pwm_parameter.N1;
|
|||
|
PWM_CTRL->N2 = pwm_parameter.N2;
|
|||
|
break;
|
|||
|
case breath_mode:
|
|||
|
PWM_CTRL->BR_TH_MAX = pwm_parameter.BR_TH_MAX;
|
|||
|
PWM_CTRL->BR_TH_MIN = pwm_parameter.BR_TH_MIN;
|
|||
|
PWM_CTRL->BR_SP = pwm_parameter.BR_SP;
|
|||
|
PWM_CTRL->T4 = pwm_parameter.T4;
|
|||
|
|
|||
|
break;
|
|||
|
}
|
|||
|
PWM_CTRL->PAUS= 1;
|
|||
|
PWM_CTRL->LED_PE= 1;
|
|||
|
}
|
|||
|
|
|||
|
void pwm_disable(PWM_x pwm_x)
|
|||
|
{
|
|||
|
switch(pwm_x){
|
|||
|
case PWM_0 :
|
|||
|
PWM_0_CTRL->LED_PE= 0;
|
|||
|
break;
|
|||
|
case PWM_1 :
|
|||
|
PWM_1_CTRL->LED_PE= 0;
|
|||
|
break;
|
|||
|
case PWM_2 :
|
|||
|
PWM_2_CTRL->LED_PE= 0;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
HPWM <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
|||
|
HPWM_PARAMETER *parameter, <EFBFBD>μ<EFBFBD>HPWM_PARAMETER<EFBFBD>ṹ<EFBFBD><EFBFBD>
|
|||
|
*/
|
|||
|
void Hpwm_Init(HPWM_PARAMETER *parameter)
|
|||
|
{
|
|||
|
Hpwm_Stop();
|
|||
|
|
|||
|
/*<2A><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>Ƶ<EFBFBD><C6B5>64M*/
|
|||
|
HPWM_CTRL->PRESCALER = parameter->prescaler;
|
|||
|
HPWM_CTRL->MODE = parameter->mode;
|
|||
|
HPWM_CTRL->COUNTER_TOP = parameter->period;
|
|||
|
|
|||
|
//dbg_printf("0:POLARITY = 0x%08x\r\n",HPWM_CTRL->POLARITY);
|
|||
|
switch(parameter->channel)
|
|||
|
{
|
|||
|
case HPWM_CH0:
|
|||
|
//PIN_CONFIG->PIN_3_SEL = PIN_SEL_HPWM_CH0;
|
|||
|
HPWM_CTRL->CMP_CH0 = parameter->duty;
|
|||
|
if(parameter->polarity == LOW_FIRST)
|
|||
|
HPWM_CTRL->POLARITY &= 0x0e;
|
|||
|
else
|
|||
|
HPWM_CTRL->POLARITY |= 0x01;
|
|||
|
|
|||
|
break;
|
|||
|
case HPWM_CH1:
|
|||
|
//PIN_CONFIG->PIN_4_SEL = PIN_SEL_HPWM_CH1;
|
|||
|
HPWM_CTRL->CMP_CH1 = parameter->duty;
|
|||
|
if(parameter->polarity == LOW_FIRST)
|
|||
|
HPWM_CTRL->POLARITY &= 0x0d;
|
|||
|
else
|
|||
|
HPWM_CTRL->POLARITY |= 0x02;
|
|||
|
|
|||
|
break;
|
|||
|
case HPWM_CH2:
|
|||
|
//PIN_CONFIG->PIN_5_SEL = PIN_SEL_HPWM_CH2;
|
|||
|
HPWM_CTRL->CMP_CH2 = parameter->duty;
|
|||
|
if(parameter->polarity == LOW_FIRST)
|
|||
|
HPWM_CTRL->POLARITY &= 0x0b;
|
|||
|
else
|
|||
|
HPWM_CTRL->POLARITY |= 0x04;
|
|||
|
|
|||
|
break;
|
|||
|
default:
|
|||
|
//PIN_CONFIG->PIN_6_SEL = PIN_SEL_HPWM_CH3;
|
|||
|
HPWM_CTRL->CMP_CH3 = parameter->duty;
|
|||
|
if(parameter->polarity == LOW_FIRST)
|
|||
|
HPWM_CTRL->POLARITY &= 0x07;
|
|||
|
else
|
|||
|
HPWM_CTRL->POLARITY |= 0x08;
|
|||
|
|
|||
|
break;
|
|||
|
}
|
|||
|
//dbg_printf("1:POLARITY = 0x%08x\r\n",HPWM_CTRL->POLARITY);
|
|||
|
#if 0
|
|||
|
dbg_printf("CMP_CH0 = %d\r\n",HPWM_CTRL->CMP_CH0);
|
|||
|
dbg_printf("CMP_CH1 = %d\r\n",HPWM_CTRL->CMP_CH1);
|
|||
|
dbg_printf("CMP_CH2 = %d\r\n",HPWM_CTRL->CMP_CH2);
|
|||
|
dbg_printf("CMP_CH3 = %d\r\n",HPWM_CTRL->CMP_CH3);
|
|||
|
#endif
|
|||
|
|
|||
|
HPWM_CTRL->EVENTS = HPWM_INT_ALL; //clr INT
|
|||
|
HPWM_CTRL->INTEN = HPWM_INT_ALL;
|
|||
|
//HPWM_CTRL->INTEN = HPWM_INT_PERIOD;
|
|||
|
//HPWM_CTRL->INTEN = HPWM_INT_TASK_STOP;
|
|||
|
//HPWM_CTRL->INTEN = HPWM_INT_NONE;
|
|||
|
|
|||
|
//NVIC_EnableIRQ(HPWM_IRQn); <20><>װԭ<D7B0><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>HPWM_IRQHandler<65>жϺ<D0B6><CFBA><EFBFBD><EFBFBD>ж<EFBFBD>̬<EFBFBD><EFBFBD>ռ<EFBFBD>ձȣ<D5B1><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD>ʱ<EFBFBD><EFBFBD><F2BFB4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϹرպ<D8B1><D5BA><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD>IJ<EFBFBD><C4B2>ξ<EFBFBD><CEBE>Ǵ<EFBFBD><C7B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õIJ<C3B5><C4B2><EFBFBD>
|
|||
|
}
|
|||
|
|
|||
|
void Hpwm_Set_duty(HPWM_CHx channels, uint16_t compare)
|
|||
|
{
|
|||
|
if(HPWM_CTRL->MODE == UP_MODE)
|
|||
|
{
|
|||
|
if(compare >= HPWM_CTRL->COUNTER_TOP) //0 <= compare <= COUNTER_TOP-1
|
|||
|
{
|
|||
|
compare = HPWM_CTRL->COUNTER_TOP - 1;
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if(compare >= HPWM_CTRL->COUNTER_TOP-1)
|
|||
|
{
|
|||
|
compare = HPWM_CTRL->COUNTER_TOP-2; //0 <= compare <= COUNTER_TOP-2
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if(channels&HPWM_CH0)
|
|||
|
{
|
|||
|
HPWM_CTRL->CMP_CH0 = compare;
|
|||
|
}
|
|||
|
if(channels&HPWM_CH1)
|
|||
|
{
|
|||
|
HPWM_CTRL->CMP_CH1 = compare;
|
|||
|
}
|
|||
|
if(channels&HPWM_CH2)
|
|||
|
{
|
|||
|
HPWM_CTRL->CMP_CH2 = compare;
|
|||
|
}
|
|||
|
if(channels&HPWM_CH3)
|
|||
|
{
|
|||
|
HPWM_CTRL->CMP_CH3 = compare;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//HPWM<57><4D>4<EFBFBD><34>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4<EFBFBD><34>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
void Hpwm_Set_period(uint16_t period)
|
|||
|
{
|
|||
|
if(period >= HPWM_CTRL->CMP_CH0)
|
|||
|
{
|
|||
|
HPWM_CTRL->COUNTER_TOP = period;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void Hpwm_Set_mode(HPWM_mode mode)
|
|||
|
{
|
|||
|
HPWM_CTRL->MODE = mode;
|
|||
|
}
|
|||
|
|
|||
|
void Hpwm_Start(void)
|
|||
|
{
|
|||
|
HPWM_CTRL->START = 1;
|
|||
|
}
|
|||
|
|
|||
|
void Hpwm_Stop(void)
|
|||
|
{
|
|||
|
HPWM_CTRL->STOP = 1;
|
|||
|
}
|
|||
|
|
|||
|
void HPWM_IRQHandler(void)
|
|||
|
{
|
|||
|
//<2F><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD>ռ<EFBFBD>ձ<EFBFBD>
|
|||
|
static uint16_t compare = 1;
|
|||
|
static uint32_t t = 0;
|
|||
|
|
|||
|
dbg_printf("HPWM_IRQHandler\r\n");
|
|||
|
|
|||
|
if(HPWM_CTRL->EVENTS & HPWM_INT_PERIOD)
|
|||
|
{
|
|||
|
compare++;
|
|||
|
if(compare == HPWM_CTRL->COUNTER_TOP)
|
|||
|
{
|
|||
|
compare = 1;
|
|||
|
|
|||
|
dbg_printf("COUNTER_TOP Can stop pwm there!\r\n");
|
|||
|
// t++;
|
|||
|
// if(t == 4)
|
|||
|
// {
|
|||
|
// Hpwm_Stop();
|
|||
|
// return;
|
|||
|
// }
|
|||
|
}
|
|||
|
Hpwm_Set_duty(HPWM_CHALL, compare);
|
|||
|
}
|
|||
|
|
|||
|
if(HPWM_CTRL->EVENTS & HPWM_INT_TASK_STOP)
|
|||
|
{
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
HPWM_CTRL->EVENTS = HPWM_INT_ALL; //clr INT
|
|||
|
}
|
|||
|
|