📄 k60-keil
字号:
/*============================================================================
文件名称:pwm.c
功能概要:K60 pwm
版权所有:卿丞数码
=============================================================================*/
#include <MK60N512MD100.h> /* MK60N512MD100 Definitions */
#include "pwm.h"
#include "define.h"
/*============================================================================
函数名称:FTM0_Init
函数返回:无
参数说明:
功能概要:通过FTM0实现PWM功能设置
版权所有:卿丞数码
=============================================================================*/
void FTM0_Init(void)
{
SIM->SCGC5 |= SIM_SCGC5_PORTC_MASK; /* Enable PORTC gate clocking */
SIM->SCGC6|=SIM_SCGC6_FTM0_MASK; //Enable the Clock to the FTM0 Module
PORTC->PCR[1] = PORT_PCR_MUX(0x04); //FTM0_CH0 参考管脚映射表
PORTC->PCR[2] = PORT_PCR_MUX(0x04); //FTM0_CH1
FTM0->OUTMASK=0x00; /*0 Channel output is not masked. It continues to operate normally.
1 Channel output is masked. It is forced to its inactive state.*/
FTM0->MODE |= FTM_MODE_WPDIS_MASK; //Disable Write Protection - enables changes to QUADEN, DECAPEN, etc.
FTM0->MODE &=~ FTM_MODE_FTMEN_MASK; //FTMEN is bit 0, need to set to zero so DECAPEN can be set to 0
FTM0->QDCTRL &=~FTM_QDCTRL_QUADEN_MASK; //Set Edge Aligned PWM QUADEN is Bit 1, Set Quadrature Decoder Mode (QUADEN) Enable to 0, (disabled)
/*设置FTM0模式:设置为边沿PWM模式*/
FTM0->CONTROLS[0].CnSC |= FTM_CnSC_ELSB_MASK; //Edge or level select
FTM0->CONTROLS[0].CnSC &=~FTM_CnSC_ELSA_MASK; //Edge or level Select
FTM0->CONTROLS[0].CnSC |= FTM_CnSC_MSB_MASK; //Channel Mode select
FTM0->CONTROLS[1].CnSC |= FTM_CnSC_ELSB_MASK; //Edge or level select
FTM0->CONTROLS[1].CnSC &=~FTM_CnSC_ELSA_MASK; //Edge or level Select
FTM0->CONTROLS[1].CnSC |= FTM_CnSC_MSB_MASK; //Channel Mode select
/*占空比=CnV/(MOD+1) PMW频率=系统频率/2/(2^FTM1_SC_PS)/FTM1_MOD */
FTM0->CNT = 0; //FTM Counter Value - reset counter to zero
FTM0->MOD = 1125; //设置周期
FTM0->CNTIN = 0; //Set the Counter Initial Value to 0
FTM0->SC = 0; //Make sure its Off!
FTM0->CONTROLS[0].CnV=0;
FTM0->CONTROLS[1].CnV=0;
FTM0->SC |= FTM_SC_CLKS(1); // Selects Clock source to be "system clock"
/*
000 - 0 - No divide
001 - 1 - Divide by 2
010 - 2 - Divide by 4
011 - 3 - Divide by 8
100 - 4 - Divide by 16
101 - 5 - Divide by 32
110 - 6 - Divide by 64
111 - 7 - Divide by 128
*/
FTM0->SC |= FTM_SC_PS(3); //sets pre-scale value see details below No divide
}
/*============================================================================
函数名称:FTM1_Init
函数返回:无
参数说明:
功能概要:通过FTM1实现50hz PWM功能设置
版权所有:卿丞数码
=============================================================================*/
void FTM1_Init(void)
{
PORTA->PCR[12] =PORT_PCR_MUX(3)| PORT_PCR_DSE_MASK;
SIM->SCGC5 |= SIM_SCGC5_PORTA_MASK;
SIM->SCGC6 |= SIM_SCGC6_FTM1_MASK; // 使能FTM1时钟
FTM1->CONTROLS[0].CnSC |= FTM_CnSC_ELSB_MASK;
FTM1->CONTROLS[0].CnSC &= ~FTM_CnSC_ELSA_MASK;
FTM1->CONTROLS[0].CnSC |= FTM_CnSC_MSB_MASK;
FTM1->MODE |= FTM_MODE_WPDIS_MASK; //Disable Write Protection - enables changes to QUADEN, DECAPEN, etc.
FTM1->MODE &=~ FTM_MODE_FTMEN_MASK; //FTMEN is bit 0, need to set to zero so DECAPEN can be set to 0
FTM1->QDCTRL &=~FTM_QDCTRL_QUADEN_MASK; //Set Edge Aligned PWM QUADEN is Bit 1, Set Quadrature Decoder Mode (QUADEN) Enable to 0, (disabled)
FTM1->SC=0;
FTM1->CNTIN = 0; // FTM0计数器的初始值
FTM1->CNT = 0; // 写任意值到该寄存器,FTM0计数器将重新装载CNTIN中的值
FTM1->MOD =28125;//14063;// 28125; // FTM0计数器的终点值 50hz 0.1321197468534452
FTM1->CONTROLS[0].CnV=0;
FTM1->SC |= FTM_SC_PS(6) | FTM_SC_CLKS(1); // Select bus clock
}
/*============================================================================
函数名称:UpdatePWM
函数返回:无
参数说明:PwmChannel:PWM通道号0-7 PwmValue:占空比设置值 占空比=PwmValue/(MOD+1)
功能概要:更新通道占空比
通道0:PC1
通道1:PC2
通道2:PC3
通道3:PC4
通道4:PD4
通道5:PD5
通道6:PD6
通道7:PD7
版权所有:卿丞数码
=============================================================================*/
void MotorUpdatePWM(unsigned short PwmChannel,unsigned short PwmValue)
{
FTM0->CONTROLS[PwmChannel].CnV=PwmValue;
}
/*============================================================================
函数名称:MotorRun
函数返回:无
参数说明:Speed :电机速度 范围-4500~+4500 负数表示倒转,绝对值越大速度值越大
功能概要:电机转动函数
正输入端为通道0:PC1
负输入端为通道1:PC2
版权所有:卿丞数码
=============================================================================*/
void MotorRun(int16_t speed)
{
if(speed<0)
{
MotorUpdatePWM(1,-speed);
MotorUpdatePWM(0,0);
}
else
{
MotorUpdatePWM(0,speed);
MotorUpdatePWM(1,0);
}
}
/*============================================================================
函数名称:SteerUpdatePWM
函数返回:无
参数说明:PwmChannel:PWM通道号0-1 PwmValue:占空比设置值 占空比=PwmValue/(MOD+1)
功能概要:舵机更新通道占空比
通道0:PA12
通道1:PA11
版权所有:卿丞数码
=============================================================================*/
void SteerUpdatePWM(unsigned short PwmChannel,unsigned short PwmValue)
{
FTM1->CONTROLS[PwmChannel].CnV=PwmValue;
}
/*============================================================================
函数名称:MotorRun
函数返回:无
参数说明:Angle :舵机转动角度 ,范围-100~+100 负数表示右转,正数表示左转,绝对值
越大转角值越大
功能概要:舵机转动函数
版权所有:卿丞数码
=============================================================================*/
void SteerRun(int16_t Angle)
{
SteerUpdatePWM(0,Angle+DirectMiddle);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -