/*********************************************************** 函数名称:TURNPWM_init 函数功能: 入口参数: 出口参数:无 备 注: ***********************************************************/ void TURNPWM_init(void) { // FTM_PWM_init(FTM1, CH0 , 180,30); //舵机占空比设置初始化 MOD =17361 ;舵机1 FTM_PWM_init(FTM1, CH1 , 180,30); //舵机占空比设置初始化 MOD =17361 ;舵机2 FTM_CnV_REG(FTMx[FTM1], CH1) = MIDSTRING ; }
/** * @brief 输出所选通道的PWM波形 * * @param module 所选模块(可取 MODULE0,MODULE1,MODULE2) * @param channel 所选通道(当module==MODULE1,可取0~7,module为其余值,可取0~1) * @param duty_count 占空比相关计数次数 * * @return 错误类型 * * @note */ ER ftm_pwm_output(ID module, ID channel, uint32_t duty_count) { FTM_MemMapPtr ftmptr = get_ftmptr(module); if((module<0) || (module>2)) return E_MOD; else if((module==0) && ((channel<0) || (channel>7))) return E_CHN; else if((module!=0)&&((channel!=0)&&(channel!=1))) return E_CHN; FTM_CnV_REG(ftmptr,channel) = duty_count; return E_OK; }
void FTM_init (FTM_MemMapPtr base) { // Habilito el pin PTC1 como salida del canal 0 PORTC_PCR1 = (PORT_PCR_ISF_MASK | PORT_PCR_MUX(0x04)); PORTB_PCR18 = (PORT_PCR_ISF_MASK | PORT_PCR_MUX(0x03)); // Habilito la llave general de las interrupciones //NVICISER1 |= NVIC_ISER_SETENA(0x0400); // Habilito el clock gating SIM_SCGC6 |= SIM_SCGC6_FTM0_MASK; SIM_SCGC6 |= SIM_SCGC6_FTM2_MASK; // Deshabilito la proteccion de escritura FTM_MODE_REG(base) = FTM_MODE_WPDIS_MASK; // Apago los flag de interrupciones FTM_STATUS_REG(base) = (FTM0_STATUS & 0x00); // Deshabilito los clocks y borro la configuracion FTM_SC_REG(base) = 0x00; // Configuro el canal 0 como nada FTM_CnSC_REG(base,0) = 0x00; // Configuro la salida inicial en alto (los LEDs son activo-bajo) FTM_MODE_REG(base) = FTM_MODE_INIT_MASK; // Configuro el PWM a duty 25% y reinicio el contador FTM_CnV_REG(base,0) = 0x0000; FTM_MOD_REG(base) = 0x0000; FTM_CNTIN_REG(base) = 0x0000; FTM_CNT_REG(base) = 0x0000; FTM_PWMLOAD_REG(base) = (FTM_PWMLOAD_LDOK_MASK | FTM_PWMLOAD_CH0SEL_MASK); // Habilito las interrupciones y los clocks, y configuro el prescaler FTM_SC_REG(base) = (FTM_SC_TOIE_MASK | FTM_SC_CLKS(0x01) | FTM_SC_PS(0x0F)); // Habilito los contadores del modulo FTM_CONF_REG(base) = FTM_CONF_BDMMODE(0x03); }
/** * @brief pwm2模块相关寄存器配置 * * @param channel pwm2所选的通道 */ static void pwm_mod2_set(ID channel) { /*使能ftm0模块时钟*/ SIM_SCGC3 |= SIM_SCGC3_FTM2_MASK; /*选择时钟源,分频系数,以及计数器计数方式*/ FTM_SC_REG(FTM2_BASE_PTR) = FTM_SC_CLKS(FTM2_PWM_CLK) | FTM_SC_PS(FTM2_PWM_PRESCALE) | ((FTM2_PWM_MODE & 0x10)<<1); /*设置计数器计数初值*/ FTM_CNTIN_REG(FTM2_BASE_PTR) = CNTIN_VALUE; /*初始化计数器*/ FTM_CNT_REG(FTM2_BASE_PTR) = FTM2_INIT_VALUE; /*设置计数器最大模值*/ FTM_MOD_REG(FTM2_BASE_PTR) = FTM2_PWM_CYCLE; /*设置FTM模块的工作方式*/ FTM_CnSC_REG(FTM2_BASE_PTR,channel) = ((FTM2_PWM_MODE & 0x0f)<<2); /*设置初始化占空比*/ FTM_CnV_REG(FTM2_BASE_PTR,channel) = PWM_INIT_VALUE; }
void FTM_setDuty(FTM_MemMapPtr base, unsigned int duty){ FTM_CnV_REG(base,0) = duty; }