5644|2

6423

帖子

17

TA的资源

版主

楼主
 

LPC1500体验+3.SCT初探 [复制链接]

SCT (State-Configurable Timers)状态可配定时计数器,SCT可用于各种定时、计数、输出调制和输入捕获操作。如计数器、函数发生器、PWM电机控制(最多四路)、红外遥控编码、解码、PWM解码、PPM调制等。

四个输出建立于某个输入的变换,每个输出可以被用做SCT的可中断输入或者其他需要多个SCT输入来触发SCT响应的应用
四个寄存器指示那个特定的输入源引起了对SCT的中断输入
4个外置的输出可以在特定的时间被采样,并且锁存其他在被SCT输入抢占之前
9个可中断输入。每个SCT的专用可中断输入可以由任意的可中断输入组合来触发


SCT作为一个多通道的标准PWM配置和使用步骤
1、初始化SCT,该函数在sct_pwm.c库文件中
  1. /* Setup board specific pin muxing */
  2. static void app_setup_pin(void)
  3. {
  4.         /* Enable SWM clock before altering SWM */
  5.         Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_SWM);

  6. #if defined(BOARD_NXP_LPCXPRESSO_1549)
  7.         /* Connect SCT output 1 to PIO0_29 */
  8.         Chip_SWM_MovablePinAssign(SWM_SCT0_OUT1_O, 29);
  9.         Chip_SWM_MovablePinAssign(SWM_SCT0_OUT0_O, 3);
  10. #endif

  11.         Chip_Clock_DisablePeriphClock(SYSCTL_CLOCK_SWM);
  12. }
复制代码
2、设置SCT频率,该函数在sct_pwm_15xx.c库文件中
  1. void Chip_SCTPWM_SetRate(LPC_SCT_T *pSCT, uint32_t freq)
  2. {
  3.         uint32_t rate;

  4.         rate = Chip_Clock_GetSystemClockRate() / freq;;

  5.         /* Stop the SCT before configuration */
  6.         Chip_SCTPWM_Stop(pSCT);

  7.         /* Set MATCH0 for max limit */
  8.         pSCT->REGMODE = 0;
  9.         Chip_SCT_SetMatchCount(pSCT, SCT_MATCH_0, 0);
  10.         Chip_SCT_SetMatchReload(pSCT, SCT_MATCH_0, rate);
  11.         pSCT->EVENT[0].CTRL = 1 << 12;
  12.         pSCT->EVENT[0].STATE = 1;

  13.         /* Set SCT Counter to count 32-bits and reset to 0 after reaching MATCH0 */
  14.         Chip_SCT_Config(pSCT, SCT_CONFIG_32BIT_COUNTER | SCT_CONFIG_AUTOLIMIT_L);
  15. }
复制代码
3、配置管脚
  1. /* Setup board specific pin muxing */
  2. static void app_setup_pin(void)
  3. {
  4.         /* Enable SWM clock before altering SWM */
  5.         Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_SWM);

  6. #if defined(BOARD_NXP_LPCXPRESSO_1549)
  7.         /* Connect SCT output 1 to PIO0_29 */
  8.         Chip_SWM_MovablePinAssign(SWM_SCT0_OUT1_O, 29);
  9.         Chip_SWM_MovablePinAssign(SWM_SCT0_OUT0_O, 3);
  10. #endif

  11.         Chip_Clock_DisablePeriphClock(SYSCTL_CLOCK_SWM);
  12. }
复制代码


4、指定一个PWM输出给一个通道,该函数在sct_pwm_15xx.c库文件中
  1. /* Setup the OUTPUT pin corresponding to the PWM index */
  2. void Chip_SCTPWM_SetOutPin(LPC_SCT_T *pSCT, uint8_t index, uint8_t pin)
  3. {
  4.         int ix = (int) index;
  5.         pSCT->EVENT[ix].CTRL = index | (1 << 12);
  6.         pSCT->EVENT[ix].STATE = 1;
  7.         pSCT->OUT[pin].SET = 1;
  8.         pSCT->OUT[pin].CLR = 1 << ix;

  9.         /* Clear the output in-case of conflict */
  10.         pSCT->RES = (pSCT->RES & ~(3 << (pin << 1))) | (0x01 << (pin << 1));

  11.         /* Set and Clear do not depend on direction */
  12.         pSCT->OUTPUTDIRCTRL = (pSCT->OUTPUTDIRCTRL & ~(3 << (pin << 1)));
  13. }
复制代码
5、设置该通道PWM输出的占空比,该函数在sct_pwm_15xx.h
  1. /**
  2. * @brief        Get number of ticks on per PWM cycle
  3. * @param        pSCT        : The base of SCT peripheral on the chip
  4. * @param        index        : Index of the PWM 1 to N (see notes)
  5. * @param        ticks        : Number of ticks the output should say ON
  6. * @return        None
  7. * @note        @a index will be 1 to N where N is the "Number of
  8. *          match registers available in the SCT - 1" or
  9. *          "Number of OUTPUT pins available in the SCT" whichever
  10. *          is minimum. The new duty cycle will be effective only
  11. *          after completion of current PWM cycle.
  12. */
  13. STATIC INLINE void Chip_SCTPWM_SetDutyCycle(LPC_SCT_T *pSCT, uint8_t index, uint32_t ticks)
  14. {
  15.         Chip_SCT_SetMatchReload(pSCT, (CHIP_SCT_MATCH_REG_T)index, ticks);
  16. }
复制代码
6、重复步骤3、4、5设置需要的pwm通道(可选)
7、启动PWM通道,该函数在sct_pwm_15xx.h
  1. /**
  2. * @brief        Start the SCT PWM
  3. * @param        pSCT        : The base of SCT peripheral on the chip
  4. * @return        None
  5. * @note        This function must be called after all the
  6. *                         configuration is completed. Do not call Chip_SCTPWM_SetRate()
  7. *                         or Chip_SCTPWM_SetOutPin() after the SCT/PWM is started. Use
  8. *                         Chip_SCTPWM_Stop() to stop the SCT/PWM before reconfiguring,
  9. *                         Chip_SCTPWM_SetDutyCycle() can be called when the SCT/PWM is
  10. *                         running to change the DutyCycle.
  11. */
  12. STATIC INLINE void Chip_SCTPWM_Start(LPC_SCT_T *pSCT)
  13. {
  14.         Chip_SCT_ClearControl(pSCT, SCT_CTRL_HALT_L | SCT_CTRL_HALT_H);
  15. }
复制代码

8、修改占空比,同步骤5
9、停止SCT/PWM(可选),在sct_pwm_15xx.h
  1. /**
  2. * @brief        Stop the SCT PWM
  3. * @param        pSCT        : The base of SCT peripheral on the chip
  4. * @return        None
  5. */
  6. STATIC INLINE void Chip_SCTPWM_Stop(LPC_SCT_T *pSCT)
  7. {
  8.         /* Stop SCT */
  9.         Chip_SCT_SetControl(pSCT, SCT_CTRL_HALT_L | SCT_CTRL_HALT_H);

  10.         /* Clear the counter */
  11.         Chip_SCT_SetControl(pSCT, SCT_CTRL_CLRCTR_L | SCT_CTRL_CLRCTR_H);
  12. }
复制代码







此帖出自NXP MCU论坛

最新回复

讲的很详细,谢谢分享!  详情 回复 发表于 2014-7-27 13:30
点赞 关注
个人签名training
 

回复
举报

6423

帖子

17

TA的资源

版主

沙发
 
  1. int main(void)
  2. {
  3.         uint32_t cnt1 = 0, cnt2 = 0;
  4.         int led_dp = 0, led_step = 1, out_dp = 0;

  5.         /* Generic Initialization */
  6.         SystemCoreClockUpdate();
  7.         Board_Init();

  8.         /* Initialize the SCT as PWM and set frequency */
  9.         Chip_SCTPWM_Init(SCT_PWM);
  10.         Chip_SCTPWM_SetRate(SCT_PWM, SCT_PWM_RATE);

  11.         /* Setup Board specific output pin */
  12.         app_setup_pin();

  13.         /* Use SCT0_OUT1 pin */
  14.         Chip_SCTPWM_SetOutPin(SCT_PWM, SCT_PWM_OUT, SCT_PWM_PIN_OUT);
  15.         Chip_SCTPWM_SetOutPin(SCT_PWM, SCT_PWM_LED, SCT_PWM_PIN_LED);

  16.         /* Start with 0% duty cycle */
  17.         Chip_SCTPWM_SetDutyCycle(SCT_PWM, SCT_PWM_OUT, Chip_SCTPWM_GetTicksPerCycle(SCT_PWM)/2);
  18.         Chip_SCTPWM_SetDutyCycle(SCT_PWM, SCT_PWM_LED, 0);
  19.         Chip_SCTPWM_Start(SCT_PWM);


  20.         /* Enable SysTick Timer */
  21.         SysTick_Config(SystemCoreClock / TICKRATE_HZ);

  22.         while (1) {
  23.                 cnt1 ++;
  24.                 cnt2 ++;
  25.                 if (cnt1 >= OUT_STEP_CNT) {
  26.                         out_dp += 10;
  27.                         if (out_dp > 100) {
  28.                                 out_dp = 0;
  29.                         }

  30.                         /* Increase dutycycle by 10% every second */
  31.                         Chip_SCTPWM_SetDutyCycle(SCT_PWM, SCT_PWM_OUT,
  32.                                 Chip_SCTPWM_PercentageToTicks(SCT_PWM, out_dp));
  33.                         cnt1 = 0;
  34.                 }

  35.                 if (cnt2 >= LED_STEP_CNT) {
  36.                         led_dp += led_step;
  37.                         if (led_dp < 0) {
  38.                                 led_dp = 0;
  39.                                 led_step = 1;
  40.                         }
  41.                         if (led_dp > 200) {
  42.                                 led_dp = 200;
  43.                                 led_step = -1;
  44.                         }

  45.                         /* Increment or Decrement Dutycycle by 0.5% every 10ms */
  46.                         Chip_SCTPWM_SetDutyCycle(SCT_PWM, SCT_PWM_LED,
  47.                                 Chip_SCTPWM_PercentageToTicks(SCT_PWM, led_dp)/2);
  48.                         cnt2 = 0;
  49.                 }
  50.                 __WFI();
  51.         }
  52.         return 0;
  53. }
复制代码
可以看到那个RGB_LED由亮变暗由暗变量周而复始了

此帖出自NXP MCU论坛
 
个人签名training
 
 

回复

388

帖子

0

TA的资源

纯净的硅(初级)

板凳
 
讲的很详细,谢谢分享!
此帖出自NXP MCU论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表