领导给一个小伙伴安排了个AUTOSAR配置任务:配置MCAL PWM调节灯光,小伙伴摸索了几个星期,都还没输出正常的波形,一度怀疑硬件有问题,甚至怀疑人生,后无奈求救于我。我也花了几天时间研究这玩意,坑还真多,走了不少弯路,于是就有了现在这个总结。
本文分十个章节来讲解:
0.关于PWM
1.RH850 MCU中的PWM
2.PWM的文件结构
3.PWM的时序调用
4.PWM的Port配置
5.PWM的基本属性配置
6.PWM的通道配置
7.PWM的Unit配置
8.PWM代码案例
9.总结
尽可能地把要点提炼出来讲解,让大家快速上手,少走弯路。
另外,对于特别问题点如Master/Slave通道,我分三个问题点来解答:
问题1:为什么会有Master和Slave这样的东西?
问题2:两个通道,如何设置占空比和周期?
问题3:Master和Slave如何选择?
希望对大家有帮助。
0.关于PWM
PWM即Pulse Width Modulation,通过IC的PWM硬件功能产生PWM信号。
PWM有几个特点参数:
- 硬件通道(HW Channel)
- 周期(Period)
- 占空比(Duty Cycle)
- 极性(Polarity,high/low)
- 空闲状态(IDLE State, high/low)
- 通道类型(Channel Class)
这些概念,做过嵌入式/MCU开发的软硬件工程师都应该很熟悉,这里就不累述了。
以控制LED灯为例,通过PWM输出可以控制其亮度,通常设置的参数有占空比和周期。原理其实很简单,快速的高低电平输出,会让LED一亮一灭,人眼是很难察觉出闪烁的,正因为这个特点,PWM大有用武之地。当然,除了LED控制,还有很多方面都可以用到PWM,例如LCD的VCOM电压,通过后级电路配合,PWM可以改变电压的。
下面通过一张图来简单说明下PWM的特点和AUTOSAR相关的函数使用。
这个图简洁表达了PWM几个API的使用意图,可以参考下面章节的时序图了解更详细的调用情况。
1.RH850 MCU中的PWM
(如果你不关注RH850的PWM,可以跳过这一章节)
RH850的PWM有几种,可以用PWM-Diag模块,也可以用TAUx模块(TAUD0, TAUB0, TAUB1, TAUJ0 and TAUJ1)。
PWM-Diag比较简单,但是资源有限,能设置的频率很低。
以下以TAUD为例来详细讲解下。
先看看TAUD这个模块通道图
问题1:为什么会有Master和Slave这样的东西?
Master/Slave通道,即常说的主/从通道
主/从通道的控制触发信号
主通道可以将控制触发信号输出到从通道。
从通道可以使用来自主通道的控制触发信号,但不能将其自身的控制触发信号输出到较低的通道。
主通道不能使用来自上层主通道的控制触发信号。
此功能通过使用一个主通道和多个从通道来生成多个PWM输出。它使能设置脉冲周期(频率)和TAUDTTOUTm的占空比。脉冲周期在主通道中设置。在从通道中设置占空比。
问题2:两个通道,如何设置占空比和周期?
这里就有个公式:
Pulse cycle = (TAUDnCDRm (master) + 1) × count clock cycle
Duty cycle [%] = (TAUDnCDRm (slave)/(TAUDnCDRm (master) + 1)) × 100
– Duty cycle = 0%
TAUDnCDRm (slave) = 0000H
– Duty cycle = 100%
TAUDnCDRm (slave) ≥ TAUDnCDRm (master) + 1
几个东西的关系,可对应下图作参考
如果想了解更多原理和细节,建议查看下RH850的SPEC中的TAUD内容,里面有很详细的描述。
2.PWM的文件结构
接着,看看AUTOSAR架构里面的PWM是怎么设计的。
以下是PWM的文件结构关系,大概了解下这方面内容就可以了。
3.PWM的时序调用
这部分是PWM的API调用时序,在使用PWM API的时候要注意这方面的内容,比较重要。
(1)Pwm_Init的使用
这一般都是EcuM会调用这个初始化,前提是要在EcuM里面配置这个初始化。
(2)Pwm_SetDutyCycle的使用
这个函数很常用,因为用到PWM基本都有会改变PWM的占空比的。
(3)Pwm_SetPeriodAndDuty的使用
这个函数也很常用,跟前面的Pwm_SetDutyCycle类似,多了个Period的参数。
(4)Pwm_SetOutputToIdle的使用
看名字就很容易理解这个函数的意图了,需不需要使用要看具体应用case。
(5)Pwm_GetOutputState的使用
看名字也很容易理解这个函数的意图,根据具体需要使用。
(6)Pwm_EnableNotification的使用
使能回调函数,前提是你要配置定义好这个Notification函数,在上升沿下降沿时会被调用。
以上都是一些理论或者概念上的东西,下面是重点,实战配置和使用PWM,PWM具体怎么配置出来,又是如何使用的?
4.PWM的Port配置
配置PWM前,需要配置其对应的Port属性。
以下选P9-0和P9-1作为例子讲解,对应的PWM模块是TAUD0
先点开Basic Editor中的Port
将P9-0配置成Master,模式选复选功能TAUD0o0_AT2OUT这个
将P9-1配置成Slave,模式选复选功能TAUD0o2_AT2OUT这个
5.PWM的基本属性配置
在配置PWM通道之前,首先要注意以下三项内容的配置,这些是基本的参数,比较简单
第一项,PwmConfigurationOfOptApiServices
即要选上哪些你要用到的API服务,把用到的勾选上就可以了
第二项,PwmDemEventParameterRefs0
这是DEM模块用到关联到的Event,即
引用DemEventParameter元素的容器,如果发生相应的错误应使用 API Dem_ReportErrorStatus API 调用这些元素。EventId 取自引用的DemEventParameter的DemEventId值。容器中提供了标准化错误,并且可以通过供应商特定的错误参考进行扩展。
一般默认就好了,如果配置提示错误,那就得好好研究下这些Event引用,跟DEM模块有关,这里不详述了。
第三项,PwmGeneral0
这个是PWM驱动基本参数配置,看名称也大概看得明白
6.PWM的通道配置
以下是PWM通道相关的配置,配置内容不多,但是不怎么好理解,算是难点了。
将Channel8配置成Master,Channel9配置成Slave
注:如果按照我这个例子配置,应该是没啥错误的,很容易就会输出PWM波形。
如果你选的不是TAUD0,或者不是这两个通道,就要注意了,Master和Slave不是随便选的。
|