| 领导给一个小伙伴安排了个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不是随便选的。
 |