PWM(Pulse Width Modulation)简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在测量、通信、工控等方面。
pwm控制器驱动提供了pwm的控制访问方法,
驱动相关的源文件包括
.
├── fpwm_g.c
├── fpwm_hw.c
├── fpwm_hw.h
├── fpwm_intr.c
├── fpwm_sinit.c
├── fpwm.c
└── fpwm.h
以下部分将指导您完成 fpwm 驱动的软件配置:
e2000的参考时钟是50M,freq为频率,duty为占空比,1/freq就是周期; perioad对应寄存器FPWM_PERIOD_OFFSET,div对应FPWM_TIM_CTRL_OFFSET寄存器中的DIV,ccr对应寄存器FPWM_CCR_OFFSET;
fpwm控制数据
typedef struct
{
FPwmConfig config;/* Pwm配置 */
u32 is_ready;/* Pwm初始化完成标志 */
u8 channel_ctrl_enable[2]; /* pwm channel ctrl enable state */
FPwmIntrEventHandler event_handler[FPWM_INTR_EVENT_NUM]; /* event handler for interrupt */
void *event_param[FPWM_INTR_EVENT_NUM]; /* parameters ptr of event handler */
} FPwmCtrl;
fpwm配置数据,FPwmConfig主要是pwm控制器id、基地址和中断号,FPwmDbVariableConfig主要包括用户可配置的死区参数,包括死区输出模式、输出极性、输入源选择、上下沿延迟等,FPwmVariableConfig主要包含pwm的输出参数,包括分频、周期、占空比、极性等
typedef struct
{
u8 instance_id;/* pwm id */
uintptr db_base_addr;
uintptr pwm_base_addr;
u64 base_clk;
u32 irq_num; /* pwm irq num*/
u32 irq_prority; /* pwm irq priority */
const char *instance_name;/* instance name */
}FPwmConfig;/* Pwm配置 */;
typedef struct
{
FPwmDbPolarity db_polarity_sel;
FPwmDbOutMode db_out_mode;
FPwmDbInMode db_in_mode;
u16 db_fall_cycle;
u16 db_rise_cycle;
}FPwmDbVariableConfig;
typedef struct
{
u8 tim_ctrl_enable;/* pwm time ctrl enable state */
FPwmTimCtrlMode tim_ctrl_mode;
u16 tim_ctrl_div;
u16 pwm_period;
FPwmCtrlMode pwm_mode;
FPwmPolarity pwm_polarity;
FPwmDutySourceMode pwm_duty_source_mode;
u16 pwm_pulse;
}FPwmVariableConfig;
死区输出模式
typedef enum
{
FPWM_DB_OUT_MODE_BYPASS = 0b00,
FPWM_DB_OUT_MODE_FORBID_RISE = 0b01,
FPWM_DB_OUT_MODE_FORBID_FALL = 0b10,
FPWM_DB_OUT_MODE_ENABLE_RISE_FALL = 0b11,
FPWM_DB_OUT_MODE_NUM
} FPwmDbOutMode;
fpwm duty比较值来源选择
typedef enum
{
FPWM_DUTY_CCR = 0,
FPWM_DUTY_FIFO = 1,
FPWM_DUTY_SEL_MODE_NUM
} FPwmDutySourceMode;;
fpwm中断事件类型
typedef enum
{
FPWM_INTR_EVENT_COUNTER = 0, /**< Handler type for counter interrupt */
FPWM_INTR_EVENT_FIFO_EMPTY = 1, /**< Handler type for fifo empty interrupt*/
FPWM_INTR_EVENT_NUM
} FPwmIntrEventType;
获取Fata控制器默认配置
const FPwmConfig *FPwmLookupConfig(FPwmInstance instance_id);
Note:
Input:
Return:
初始化fpwm控制器, 使之可以使用
FError FPwmCfgInitialize(FPwmCtrl *pctrl, const FPwmConfig *input_config_p);
Note:
Input:
Return:
设置pwm死区输出的配置参数
FError FPwmDbVariableSet(FPwmCtrl *pctrl, FPwmDbVariableConfig *db_cfg);
Note:
Input:
Return:
设置pwm通道的参数,使能该通道
FError FPwmVariableSet(FPwmCtrl *pctrl, u32 channel, FPwmVariableConfig *pwm_cfg);
Note:
Input:
Return:
设置pwm通道的占空比比较值
FError FPwmPulseSet(FPwmCtrl *pctrl, u32 channel, u16 pwm_ccr);
Note:
Input:
Return:
使能pwm控制器
void FPwmEnable(FPwmCtrl *pctrl, u32 channel);
Note:
Input:
Return:
注册pwm中断事件函数
void FPwmRegisterInterruptHandler(FPwmCtrl *instance_p, FPwmIntrEventType event_type,
FPwmIntrEventHandler handler, void *param);
Note:
Input:
Return:
pwm中断处理函数入口
void FPwmIntrHandler(s32 vector, void *args);
Note:
Input:
Return: