[活动] 【极海G32A1465测评】3、PWM点灯

[复制链接]
707|0
 楼主| sujingliang 发表于 2024-12-14 21:49 | 显示全部楼层 |阅读模式
本帖最后由 sujingliang 于 2024-12-14 21:54 编辑

一、板上资源
RGB灯对应LED1、LED2、LED3

10.png

11.png
对应引脚:PMD0、PMD15、PMD16

查了一下手册,引脚复用情况:



手册上写:PMD0对应CFGTMR2_CH2,但这里可能是笔误:实际应该是CFGTMR0_CH2
PMD15对应CFGTMR0_CH0,PMD15对应CFGTMR0_CH1


二、引脚配置
复用:PM_MUX_ALT2
PMD0:CFGTMR0_CH2
PMD15:CFGTMR0_CH0
PMD16:CFGTMR0_CH1
  1. {
  2.         .base            = PMD,
  3.         .pinPmIdx        = 0U,                //LED1        CFGTMR0_CH2
  4.         .pullCfg         = PM_INTERNAL_PULL_NOT_ENABLED,
  5.         .drvSel          = PM_LOW_DRIVE_STRENGTH,
  6.         .passiveFilt     = false,
  7.         .mux             = PM_MUX_ALT2,//PM_MUX_AS_GPIO,
  8.         .pinLk           = false,
  9.         .intCfg          = PM_DMA_INT_DISABLED,
  10.         .clrIntFlg       = false,
  11.         .gpioBase        = NULL,
  12.         .digitFilt       = false,        
  13.     },
  14.     {
  15.         .base            = PMD,
  16.         .pinPmIdx        = 15U,                //LED2        CFGTMR0_CH0
  17.         .pullCfg         = PM_INTERNAL_PULL_NOT_ENABLED,
  18.         .drvSel          = PM_LOW_DRIVE_STRENGTH,
  19.         .passiveFilt     = false,
  20.         .mux             = PM_MUX_ALT2,
  21.         .pinLk           = false,
  22.         .intCfg          = PM_DMA_INT_DISABLED,
  23.         .clrIntFlg       = false,
  24.         .gpioBase        = NULL,
  25.         .digitFilt       = false,
  26.     },
  27.     {
  28.         .base            = PMD,
  29.         .pinPmIdx        = 16U,                        //LED3        CFGTMR0_CH1
  30.         .pullCfg         = PM_INTERNAL_PULL_NOT_ENABLED,
  31.         .drvSel          = PM_LOW_DRIVE_STRENGTH,
  32.         .passiveFilt     = false,
  33.         .mux             = PM_MUX_ALT2,
  34.         .pinLk           = false,
  35.         .intCfg          = PM_DMA_INT_DISABLED,
  36.         .clrIntFlg       = false,
  37.         .gpioBase        = NULL,
  38.         .digitFilt       = false,
  39.     },
三、TMR初始化


  1. CFGTMR_Init(CFGTMR0_INSTANCE, &g_cfgtmr0InitConfig, &cfgtmr0State);               
  2. /* Initialize CFGTMR PWM */
  3.     CFGTMR_InitPWM(CFGTMR0_INSTANCE, &g_cfgtmr0PWMInitConfig);
参数g_cfgtmr0InitConfig:
  1. /* CFGTMR user initialize config */
  2. CFGTMR_USER_CONFIG_T g_cfgtmr0InitConfig =
  3. {
  4.     {
  5.         .softSync     = true,              /* Software trigger state */
  6.         .hwSync0      = false,             /* Hardware trigger 1 state */
  7.         .hwSync1      = false,             /* Hardware trigger 2 state */
  8.         .hwSync2      = false,             /* Hardware trigger 3 state */
  9.         .maxLoadingPoint  = false,             /* Max loading point state */
  10.         .minLoadingPoint  = false,             /* Min loading point state */
  11.         .inverterSync     = CFGTMR_PWM_SYNC,     /* Update mode for ICTRL register */
  12.         .outRegSync       = CFGTMR_PWM_SYNC,     /* Update mode for SWOCTRL register */
  13.         .maskRegSync      = CFGTMR_PWM_SYNC,     /* Update mode for OMASK register */
  14.         .initCounterSync  = CFGTMR_PWM_SYNC,     /* Update mode for INITV register */
  15.         .autoClrTrigger   = true,              /* Automatic clear of the trigger */
  16.         .syncPoint        = CFGTMR_UPDATE_NOW,   /* Synchronization point */
  17.     },
  18.     .cfgtmrMode        = CFGTMR_MODE_EDGE_ALIGNED_PWM,  /* Mode of operation for CFGTMR */
  19.     .BDMMode         = CFGTMR_BDM_MODE_11,            /* CFGTMR debug mode */
  20.     .cfgtmrPsc         = CFGTMR_CLOCK_DIV_1,            /* CFGTMR clock prescaler */
  21.     .cfgtmrClkSrc      = CFGTMR_CLOCK_SRC_SYSTEMCLK,    /* CFGTMR clock source */
  22.     .isEnableInitTrg = false,                       /* Initialization trigger */
  23.     .isEnableInterrupt = false,                     /* Interrupt state */
  24. };
softSync:软件触发状态,设置为true表示启用软件触发。
hwSync0、hwSync1、hwSync2:硬件触发状态,分别对应硬件触发1、2、3,这里都设置为false表示禁用。
maxLoadingPoint、minLoadingPoint:最大和最小加载点状态,这里都设置为false表示禁用。
inverterSync、outRegSync、maskRegSync、initCounterSync:这些参数定义了不同寄存器的更新模式,这里都设置为CFGTMR_PWM_SYNC,表示使用PWM同步模式更新。
autoClrTrigger:自动清除触发状态,设置为true表示启用自动清除触发。
syncPoint:同步点,设置为CFGTMR_UPDATE_NOW表示立即更新。
cfgtmrMode:CFGTMR的工作模式,设置为CFGTMR_MODE_EDGE_ALIGNED_PWM表示边缘对齐PWM模式。
BDMMode:CFGTMR的调试模式,设置为CFGTMR_BDM_MODE_11。
cfgtmrPsc:CFGTMR的时钟预分频器,设置为CFGTMR_CLOCK_DIV_1表示不分频。
cfgtmrClkSrc:CFGTMR的时钟源,设置为CFGTMR_CLOCK_SRC_SYSTEMCLK表示使用系统时钟。
isEnableInitTrg:初始化触发状态,设置为false表示禁用初始化触发。
isEnableInterrupt:中断状态,设置为false表示禁用中断。


参数g_cfgtmr0PWMInitConfig:
  1. /* CFGTMR PWM initialize config */
  2. CFGTMR_PWM_PARAM_T g_cfgtmr0PWMInitConfig =
  3. {
  4.     .numOfIndependentPwmChns  = 3U,                         /* Independent PWM channels number */
  5.     .numOfCombinedPwmChns     = 0U,                         /* cCombined PWM channels number */
  6.     .mode                     = CFGTMR_MODE_EDGE_ALIGNED_PWM, /* CFGTMR operation mode, Configured as PWM mode */
  7.     .uFreqHZ                  = 10000U,                     /* PWM frequency in HZ */
  8.     .deadTimeVal              = 0U,                         /* Dead time value */
  9.     .deadTimePsc              = CFGTMR_DEADTIME_DIV_1,        /* Dead time prescale */
  10.     .pwmIndependentChnCfg     = g_cfgtmr0PWMIndependentChannelsConfig, /* Configuration for independent PWM channels */
  11.     .pwmCombinedChnCfg        = NULL,                               /* Configuration for combined PWM channels */
  12.     .pwmFaultCfg              = &g_cfgtmr0PWMFaultConfig               /* Configuration for PWM fault */
  13. };
numOfIndependentPwmChns:独立PWM通道的数量。
numOfCombinedPwmChns:组合PWM通道的数量(在这个例子中为0n,表示没有使用组合通道)。
mode:CFGTMR的操作模式,这里配置为CFGTMR_MODE_EDGE_ALIGNED_PWM,即边缘对齐PWM模式。
uFreqHZ:PWM信号的频率,以赫兹为单位。
deadTimeVal:死区时间的值。注意,如果enableDeadTime为false,则这个值将被忽略。
deadTimePsc:死区时间预分频器。它决定了死区时间的分辨率。
pwmIndependentChnCfg:指向独立PWM通道配置数组的指针。在这个例子中,它指向了一个包含单个元素的数组。
pwmCombinedChnCfg:指向组合PWM通道配置数组的指针。在这个例子中,它被设置为NULL,因为没有使用组合通道。
pwmFaultCfg:指向PWM故障配置的指针。它允许配置在检测到故障时PWM应该如何响应。


参数g_cfgtmr0PWMIndependentChannelsConfig:
  1. /* CFGTMR the PWM of the independent channels config */
  2. CFGTMR_INDEPENDENT_CHAN_PARAM_T g_cfgtmr0PWMIndependentChannelsConfig[3] =
  3. {
  4.     {
  5.         .hwChannelId = 0,                        /* Hardware channel ID */
  6.         .dutyCycle   = 0x2000U,                  /* Duty cycle percent 0-0x8000 */
  7.         .polarity    = CFGTMR_POLARITY_HIGH,       /* Polarity of the PWM signal generated on MCU pin. */
  8.         .safeState   = CFGTMR_LOW_STATE,           /* Safe state of the PWM channel when faults are detected */
  9.         .enableSecondChnOutput = false,          /* Enabled/disabled the channel (n+1) output */
  10.         .secondChnPolarity = CFGTMR_MAIN_INVERTED, /* Select channel (n+1) output relative to channel (n) */
  11.         .enableDeadTime = false,                 /* Enable/disable dead time */
  12.         .isExternalTrigger = false,              /* Enable/disable external Trigger */
  13.     },
  14.                 {
  15.         .hwChannelId = 1,                        /* Hardware channel ID */
  16.         .dutyCycle   = 0x2000U,                  /* Duty cycle percent 0-0x8000 */
  17.         .polarity    = CFGTMR_POLARITY_HIGH,       /* Polarity of the PWM signal generated on MCU pin. */
  18.         .safeState   = CFGTMR_LOW_STATE,           /* Safe state of the PWM channel when faults are detected */
  19.         .enableSecondChnOutput = false,          /* Enabled/disabled the channel (n+1) output */
  20.         .secondChnPolarity = CFGTMR_MAIN_INVERTED, /* Select channel (n+1) output relative to channel (n) */
  21.         .enableDeadTime = false,                 /* Enable/disable dead time */
  22.         .isExternalTrigger = false,              /* Enable/disable external Trigger */
  23.     },
  24.                 {
  25.         .hwChannelId = 2,                        /* Hardware channel ID */
  26.         .dutyCycle   = 0x2000U,                  /* Duty cycle percent 0-0x8000 */
  27.         .polarity    = CFGTMR_POLARITY_HIGH,       /* Polarity of the PWM signal generated on MCU pin. */
  28.         .safeState   = CFGTMR_LOW_STATE,           /* Safe state of the PWM channel when faults are detected */
  29.         .enableSecondChnOutput = false,          /* Enabled/disabled the channel (n+1) output */
  30.         .secondChnPolarity = CFGTMR_MAIN_INVERTED, /* Select channel (n+1) output relative to channel (n) */
  31.         .enableDeadTime = false,                 /* Enable/disable dead time */
  32.         .isExternalTrigger = false,              /* Enable/disable external Trigger */
  33.     }
  34. };
hwChannelId:硬件通道ID,指定了哪个硬件通道将被配置为PWM输出。
dutyCycle:占空比,以十六进制表示,范围从0到0x8000,对应0%到100%的占空比。
polarity:PWM信号的极性,CFGTMR_POLARITY_HIGH 表示高电平有效,CFGTMR_POLARITY_LOW 表示低电平有效。
safeState:当检测到故障时,PWM通道的安全状态,CFGTMR_LOW_STATE 表示低电平,CFGTMR_HIGH_STATE 表示高电平。
enableSecondChnOutput:是否启用第二个通道(n+1)的输出。在某些硬件中,一个PWM通道可能伴随着一个附加的、相关的通道。
secondChnPolarity:第二个通道(n+1)相对于第一个通道(n)的极性。CFGTMR_MAIN_INVERTED 表示第二个通道的极性与第一个通道相反。
enableDeadTime:是否启用死区时间。死区时间用于防止两个互补的PWM信号同时处于高电平或低电平,从而避免短路。
isExternalTrigger:是否启用外部触发。外部触发允许PWM信号的生成由外部事件控制。


四、调节PWM周期及占空比


  1. CFGTMR_UpdatePwmPeriod(CFGTMR0_INSTANCE, CFGTMR_PWM_UPDATE_IN_DUTY_CYCLE, frequencyHZ, true);
  1. CFGTMR_UpdatePwmChannel(
  2.                                   CFGTMR0_INSTANCE,
  3.                                   g_cfgtmr0PWMIndependentChannelsConfig[0].hwChannelId,
  4.                                   CFGTMR_PWM_UPDATE_IN_DUTY_CYCLE,
  5.                                   dutyCycle,
  6.                                   0U,
  7.                                   true);



五、while(1)
  1. while (1)
  2.     {
  3.         /* Change PWM output frequency */
  4.         if (BTN_GetState(BUTTON_KEY1) == 0U)
  5.         {
  6.             frequencyHZ += 10000U;
  7.             if (frequencyHZ > 100000)
  8.             {
  9.                 frequencyHZ = 10000U;
  10.             }
  11.             
  12.             CFGTMR_UpdatePwmPeriod(CFGTMR0_INSTANCE, CFGTMR_PWM_UPDATE_IN_DUTY_CYCLE, frequencyHZ, true);

  13.             CFGTMR_UpdatePwmChannel(
  14.                                   CFGTMR0_INSTANCE,
  15.                                   g_cfgtmr0PWMIndependentChannelsConfig[0].hwChannelId,
  16.                                   CFGTMR_PWM_UPDATE_IN_DUTY_CYCLE,
  17.                                   dutyCycle,
  18.                                   0U,
  19.                                   true);
  20.                                                 
  21.                                                 CFGTMR_UpdatePwmChannel(
  22.                                   CFGTMR0_INSTANCE,
  23.                                   g_cfgtmr0PWMIndependentChannelsConfig[1].hwChannelId,
  24.                                   CFGTMR_PWM_UPDATE_IN_DUTY_CYCLE,
  25.                                   dutyCycle,
  26.                                   0U,
  27.                                   true);
  28.                         
  29.                                                 CFGTMR_UpdatePwmChannel(
  30.                                   CFGTMR0_INSTANCE,
  31.                                   g_cfgtmr0PWMIndependentChannelsConfig[2].hwChannelId,
  32.                                   CFGTMR_PWM_UPDATE_IN_DUTY_CYCLE,
  33.                                   dutyCycle,
  34.                                   0U,
  35.                                   true);
  36.          
  37.             printf("CFGTMR PWM output frequency %dKHz.\r\n", frequencyHZ / 1000);
  38.             while (BTN_GetState(BUTTON_KEY1) == 0U);
  39.         }
  40.         
  41.         /* Change PWM output duty cycle */
  42.         if (BTN_GetState(BUTTON_KEY2) == 0U)
  43.         {
  44.              dutyCycle += 0x1000U;
  45.             if (dutyCycle > CFGTMR_MAX_DUTY_CYCLE)
  46.             {
  47.                 dutyCycle = 0x2000U;
  48.             }

  49.             CFGTMR_UpdatePwmChannel(
  50.                                   CFGTMR0_INSTANCE,
  51.                                   g_cfgtmr0PWMIndependentChannelsConfig[0].hwChannelId,
  52.                                   CFGTMR_PWM_UPDATE_IN_DUTY_CYCLE,
  53.                                   dutyCycle,
  54.                                   0U,
  55.                                   true);
  56.              CFGTMR_UpdatePwmChannel(
  57.                                   CFGTMR0_INSTANCE,
  58.                                   g_cfgtmr0PWMIndependentChannelsConfig[1].hwChannelId,
  59.                                   CFGTMR_PWM_UPDATE_IN_DUTY_CYCLE,
  60.                                   dutyCycle,
  61.                                   0U,
  62.                                   true);

  63.                                                 CFGTMR_UpdatePwmChannel(
  64.                                   CFGTMR0_INSTANCE,
  65.                                   g_cfgtmr0PWMIndependentChannelsConfig[2].hwChannelId,
  66.                                   CFGTMR_PWM_UPDATE_IN_DUTY_CYCLE,
  67.                                   dutyCycle,
  68.                                   0U,
  69.                                   true);
  70.                                                                                                                         
  71.             printf("CFGTMR PWM output duty cycle %0.2f%%.\r\n", ((float)dutyCycle / CFGTMR_MAX_DUTY_CYCLE) * 100);
  72.             while (BTN_GetState(BUTTON_KEY2) == 0U);
  73.         }
  74.     }
按下B1调节PWM周期按下B2调节PWM空比

六、运行效果
12.png

tutieshi_480x270_7s.gif



您需要登录后才可以回帖 登录 | 注册

本版积分规则

84

主题

147

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部