AUTOSAR PWM驱动详解
目录
1. 概述
AUTOSAR PWM驱动(Pulse Width Modulation Driver)是AUTOSAR基础软件中微控制器抽象层(MCAL)的一个重要组件。PWM驱动提供微控制器内部PWM阶段(脉冲宽度调制)的初始化和控制功能。PWM模块产生具有可变脉冲宽度的信号,允许选择占空比和信号周期时间。
PWM驱动的主要功能包括:
- 初始化和配置PWM通道
- 设置和调整PWM信号的周期和占空比
- 控制PWM输出状态
- 处理PWM边缘通知
PWM信号的描述如下图所示:
在这里插入图片描述
2. PWM驱动架构
2.1 模块层次结构
AUTOSAR软件架构采用分层设计方法,PWM驱动位于微控制器抽象层(MCAL)中。下图展示了PWM驱动在AUTOSAR架构中的位置以及与其他模块的关系:
此架构图展示了AUTOSAR PWM驱动的分层结构,包括:
- 应用层:包含使用PWM功能的应用软件组件
- 运行时环境(RTE):连接应用软件与基础软件的中间层
- ECU抽象层:提供标准化的PWM接口
- 微控制器抽象层(MCAL):
- PWM驱动:实现PWM功能的核心模块,包含初始化、运行时控制、回调处理和通知功能
- DET(默认错误跟踪器):用于报告和记录开发错误
- MCU驱动:负责系统时钟和PLL设置
- PORT驱动:负责端口引脚功能配置
- 微控制器硬件:包括PWM硬件、MCU硬件和端口硬件
2.2 依赖关系
PWM驱动与其他模块的依赖关系如下:
- MCU驱动:PWM驱动依赖于MCU驱动来设置预分频器、系统时钟和PLL。PWM的时钟受系统时钟变化的影响(例如PLL开关)。
- PORT驱动:用于设置端口引脚功能,确保PWM信号能够正确输出。
- DET(默认错误跟踪器):在开发模式下用于错误报告和追踪。
根据源文档所述:
PWM驱动依赖于系统时钟。因此,系统时钟的变化(例如PLL开启或关闭)也会影响PWM硬件的时钟设置。
3. PWM驱动状态管理
3.1 状态转换
PWM驱动模块在其生命周期中会经历不同的状态。下图展示了PWM驱动的状态转换图:
3.2 状态说明
PWM驱动存在以下主要状态:
-
未初始化状态:
- PWM模块处于复位状态
- 所有硬件通道未配置
- 不能使用PWM模块的其他API
- 通过调用
Pwm_Init()
函数可以转换到初始化完成状态
-
初始化完成状态:包含两个子状态:
- 正常工作状态:
- PWM信号按照配置产生输出
- 可以动态调整占空比和周期
- 可以处理边沿通知
- 空闲状态:
- PWM通道被设置为空闲状态
- 输出信号为预配置的空闲电平
- 可以通过调用
Pwm_SetDutyCycle()
或Pwm_SetPeriodAndDuty()
恢复运行
- 正常工作状态:
状态转换流程:
- 从未初始化到初始化完成:通过
Pwm_Init()
函数实现 - 从初始化完成回到未初始化:通过
Pwm_DeInit()
函数实现 - 从正常工作到空闲状态:通过
Pwm_SetOutputToIdle()
函数实现 - 从空闲回到正常工作状态:通过
Pwm_SetDutyCycle()
或Pwm_SetPeriodAndDuty()
函数实现
4. PWM驱动配置结构
4.1 数据类型定义
PWM驱动模块使用多种数据类型来定义其配置和操作参数。下图展示了PWM驱动的主要配置数据类型:
4.2 配置参数
PWM驱动定义了以下关键数据类型和配置参数:
-
Pwm_ConfigType
:包含PWM驱动初始化数据的结构体类型,其具体内容取决于硬件实现。 -
通道相关类型:
Pwm_ChannelType
:PWM通道的数值标识符(8至32位)Pwm_ChannelClassType
:定义PWM通道的类别PWM_VARIABLE_PERIOD
:可变周期通道,周期和占空比都可以变更PWM_FIXED_PERIOD
:固定周期通道,只有占空比可以变更PWM_FIXED_PERIOD_SHIFTED
:固定移相周期通道
Pwm_OutputStateType
:PWM输出状态PWM_HIGH
:PWM通道处于高电平状态PWM_LOW
:PWM通道处于低电平状态
Pwm_EdgeNotificationType
:PWM边沿通知类型PWM_RISING_EDGE
:上升沿通知PWM_FALLING_EDGE
:下降沿通知PWM_BOTH_EDGES
:上升沿和下降沿通知
Pwm_PeriodType
:定义PWM信号的周期(8至32位)
-
电源状态相关类型:
Pwm_PowerStateType
:当前激活或设置为目标的电源状态PWM_FULL_POWER
:完全功率模式- 1至255:功耗递减的电源模式
Pwm_PowerStateRequestResultType
:与电源状态转换相关的请求结果
-
通道配置参数:
ChannelId
:通道标识符ChannelClass
:通道类别(变量周期、固定周期等)DefaultPeriod
:默认周期值DefaultDutyCycle
:默认占空比值Polarity
:极性(高或低)IdleState
:空闲状态(高或低)PhaseShift
:通道相移
占空比缩放方案:
0x0000
表示0%0x8000
表示100%- 绝对占空比计算公式:
AbsoluteDutyCycle = ((uint32)AbsolutePeriodTime * RelativeDutyCycle) >> 15
5. PWM驱动操作流程
5.1 初始化流程
下图展示了PWM驱动的初始化和使用流程的序列图:
初始化阶段的主要步骤:
- 应用软件通过ECU抽象层请求初始化PWM驱动
- 调用
Pwm_Init(ConfigPtr)
函数,传入配置指针 - 检查配置指针是否有效:
- 若为NULL,报告错误:
Det_ReportError(PWM_MODULE_ID, 0, PWM_INIT_API_ID, PWM_E_PARAM_POINTER)
- 若有效,保存配置并继续初始化
- 若为NULL,报告错误:
- 初始化所有PWM通道并配置相应的硬件寄存器
- 设置初始化完成标志
- 返回初始化结果给应用
5.2 运行时控制
PWM驱动提供以下运行时控制API:
-
Pwm_SetDutyCycle
:设置PWM通道的占空比void Pwm_SetDutyCycle(Pwm_ChannelType ChannelNumber, uint16 DutyCycle)
-
Pwm_SetPeriodAndDuty
:设置PWM通道的周期和占空比void Pwm_SetPeriodAndDuty(Pwm_ChannelType ChannelNumber, Pwm_PeriodType Period, uint16 DutyCycle)
-
Pwm_SetOutputToIdle
:将PWM输出设置为配置的空闲状态void Pwm_SetOutputToIdle(Pwm_ChannelType ChannelNumber)
-
Pwm_GetOutputState
:读取PWM通道的内部状态Pwm_OutputStateType Pwm_GetOutputState(Pwm_ChannelType ChannelNumber)
运行时操作流程包括:
- 检查模块是否已初始化,未初始化则报错
- 验证通道号是否有效,无效则报错
- 执行相应的操作(设置占空比、周期等)
- 更新硬件寄存器以实现所需功能
5.3 通知处理
PWM驱动支持边缘通知机制,当PWM信号发生边缘变化时会触发通知回调:
-
上升沿通知:当PWM信号从低到高变化时触发
void Pwm_RisingEdgeNotification(Pwm_ChannelType ChannelNumber)
-
下降沿通知:当PWM信号从高到低变化时触发
void Pwm_FallingEdgeNotification(Pwm_ChannelType ChannelNumber)
通知处理流程:
- PWM硬件触发中断
- PWM驱动识别中断类型(上升沿或下降沿)
- 调用相应的通知回调函数
- 应用软件处理通知
6. 总结
AUTOSAR PWM驱动是一个位于微控制器抽象层的标准化模块,提供对微控制器内部PWM功能的访问和控制。通过遵循AUTOSAR标准,PWM驱动实现了以下目标:
- 标准化接口:提供统一的API接口,使上层软件可以独立于硬件实现
- 模块化设计:作为MCAL层的一部分,与其他模块如MCU驱动和PORT驱动协同工作
- 可配置性:支持多种配置选项,适应不同的应用需求
- 状态管理:实现完整的状态管理机制,确保模块的正确使用
- 错误处理:提供全面的错误检测和报告机制
PWM驱动的主要特点包括:
- 支持多种通道类型(可变周期、固定周期、固定移相周期)
- 提供精确的占空比控制,使用特殊的缩放方案
- 支持边缘通知机制,便于应用软件响应PWM信号变化
- 实现低功耗管理功能,支持多种电源状态
通过本文档的分析和图解,我们深入了解了AUTOSAR PWM驱动的架构、配置、状态管理和操作流程,为开发和使用AUTOSAR标准PWM功能提供了全面的指导。