标题:
k60直立车源程序 省赛保底程序
[打印本页]
作者:
xxooxx
时间:
2018-4-28 19:40
标题:
k60直立车源程序 省赛保底程序
k60直立
0.jpg
(41.34 KB, 下载次数: 56)
下载附件
2018-4-28 23:30 上传
单片机源程序如下:
/*************************************************
第九届电磁组ARM底层 by
**************************************************/
#include "All_Headers.h"
/****************************************************************
功能:电机PWM初始化
形参:void
返回值:void
*****************************************************************/
void Motor_Init(void)//用FTM0
{
GPIO_SetPinMod(PORTD,4,4);//PORTD,4,6,特殊功能号4对应FTM0的CH4与CH6 PWM输出功能
GPIO_SetPinMod(PORTD,6,4);
GPIO_SetPinMod(PORTC,1,4);//PORTC,1,3,特殊功能号4对应FTM0的CH4与CH6 PWM输出功能
GPIO_SetPinMod(PORTC,3,4);
SIM_SCGC6 |= SIM_SCGC6_FTM0_MASK;//开启对应FTM模块时钟门
FTM0_MODE |= FTM_MODE_WPDIS_MASK;//关闭写保护
FTM0_C4SC |= FTM_CnSC_MSB_MASK + FTM_CnSC_ELSB_MASK;//边沿PWM,起始高电平
FTM0_C6SC |= FTM_CnSC_MSB_MASK + FTM_CnSC_ELSB_MASK;//边沿PWM,起始高电平
FTM0_SC &= ~FTM_SC_TOIE_MASK;//关闭溢出中断
FTM0_SC |= FTM_SC_CLKS(1) + FTM_SC_PS(2);//选择50MHZ总线时钟 且4分频 即FTM0计数频率 为 12.5MHZ(f_ftm = f_busclk / prescaler)
FTM0_OUTMASK = 0xAF;//打开对应PWM输出通道CH0与CH2
FTM0_CNTIN = 0;//FTMCNT的初始值寄存器,设置为0
FTM0_MOD = 750;//FTMCNT的终了值寄存器,这里即周期数寄存器,这里折合成16.6KHZ 60us周期(f_motor = f_ftm / (FTMMOD - FTMCNTIN))
FTM0_C1V = 0;//FTMCNT的输出比较值寄存器,这里即占空比寄存器,初始化为0,即空PWM输出 !!!C0V与C1V分别控制正反转,绝对不允许同时输出PWM
FTM0_C3V = 0;//FTMCNT的输出比较值寄存器,这里即占空比寄存器,初始化为0,即空PWM输出
FTM0_MODE &= ~FTM_MODE_FTMEN_MASK;//启动FTM0
FTM0_CNT = 0;//初始化FTM0计数器
FTM_enablePWMCh(FTM0, 0, 0, 750, 0);//电机L1
FTM_enablePWMCh(FTM0, 2, 0, 750, 0);//电机R1
FTM_enablePWMCh(FTM0, 4, 0, 750, 0);//电机R2
FTM_enablePWMCh(FTM0, 6, 0, 750, 0);//电机L2
}
/*******************************************************************************
* 函数名称: QUAD_Init
* 描 述:设置正交解码模块
*******************************************************************************/
void QUAD_Init(void)
{
GPIO_SetPinMod(PORTA, 12, 7); // 配置相应引脚的功能号,FTM1_QD_PHA
GPIO_SetPinMod(PORTA, 13, 7); // 配置相应引脚的功能号,FTM1_QD_PHB
GPIO_SetPinMod(PORTB, 18, 6); // 配置相应引脚的功能号,FTM2_QD_PHA
GPIO_SetPinMod(PORTB, 19, 6); // 配置相应引脚的功能号,FTM2_QD_PHB
FTM_initQUAD(FTM1, 0, 0, 65535); // 配置正交解码模块参数
FTM_initQUAD(FTM2, 0, 0, 65535);
FTM_enableQUAD(FTM1); // 使能正交解码
FTM_enableQUAD(FTM2);
}
/****************************************************************
功能:ADC初始化
形参:void
返回值:void
*****************************************************************/
void ADC_Init(void)
{
GPIO_SetPinMod(PORTE,18,0);//PORTE,0,1,2,3特殊功能号0对应AD采集功能
GPIO_SetPinMod(PORTE,19,0);
GPIO_SetPinMod(PORTE,24,0);
GPIO_SetPinMod(PORTE,25,0);
SIM_SCGC6 |= SIM_SCGC6_ADC0_MASK;//ADC0时钟门开启
ADC0_CFG1 |= ADC_CFG1_ADIV(2) + ADC_CFG1_MODE(2)+ ADC_CFG1_ADICLK(0); //ADC时钟2分频f_adcclk = f_bus / 2 = 25Mhz,单端输入,十位精度
ADC0_CFG2 &= ~(ADC_CFG2_MUXSEL_MASK);//选中A组
ADC0_SC3 |= ADC_SC3_AVGE_MASK + ADC_SC3_AVGS(2);//16次采样硬件求平均
ADC0_SC1A &= ~(ADC_SC1_AIEN_MASK);//中断使能关闭
ADC0_SC1A &= ~(ADC_SC1_DIFF_MASK);//采用单端采样方式
ADC_CFG2_REG(ADC0) &= ~ADC_CFG2_MUXSEL_MASK;
}
/****************************************************************
功能:PIT初始化
形参:void
返回值:void
*****************************************************************/
void PIT_Init(void)
{
SIM_SCGC6 |= SIM_SCGC6_PIT_MASK;//开启PIT时钟门 ,PIT时钟源为BUSCLK,50MHZ
PIT_TCTRL0 &= ~PIT_TCTRL_TEN_MASK;//先关闭时钟
PIT_MCR &= ~(PIT_MCR_MDIS_MASK);//打开PIT
PIT_LDVAL0 = 50000;//PIT计数器装载值寄存器,这里即1ms间隔中断,f_pit_interrupt = f_pitclk / ldval
PIT_TCTRL0 |= PIT_TCTRL_TIE_MASK ;//打开PIT溢出中断
EnableInt_Kinetis(68);//开启对应的中断
SetIntPri_Kinetis(68,0);//置中断优先级0
PIT_TCTRL0 |= PIT_TCTRL_TEN_MASK;//打开PIT时钟
}
/****************************************************************
功能:拨码盘初始化
形参:void
返回值:void
*****************************************************************/
void Dial_Init(void)
{
GPIO_SetPinMod(PORTC, 14, 1);//拨码左1
GPIO_SetPinMod(PORTC, 15, 1);//拨码左2
GPIO_SetPinMod(PORTC, 16, 1);//拨码右2
GPIO_SetPinMod(PORTC, 17, 1);//拨码右1
GPIO_SetPinDir(PORTC, 14, 0);
GPIO_SetPinDir(PORTC, 15, 0);
GPIO_SetPinDir(PORTC, 16, 0);
GPIO_SetPinDir(PORTC, 17, 0);
}
/****************************************************************
功能:管脚初始化
形参:void
返回值:void
*****************************************************************/
void GPIO_Port_Init(void)
{
//配置为GPIO功能的示例
SIM_SCGC5 |= SIM_SCGC5_PORTD_MASK;//打开GPIO对应时钟门,各模块时钟门冲突不用考虑,其他时钟门优先于GPIO时钟门
PORTD_PCR0 |= PORT_PCR_MUX(1);
}
/****************************************************************
功能:系统初始化
形参:void
返回值:void
*****************************************************************/
void System_Init(void)
{
GPIO_Port_Init();
I2C_Driver_Init();
L3G4200D_Driver_Init();
MMA7455_Driver_Init();
Motor_Init();
QUAD_Init();
ADC_Init();
PIT_Init();
Dial_Init();
}
/**********************************************************************************
功能: AD读通道,存入目标地址
形参:adc ADC模块,如ADC0,ADC1;channel ADC通道;result 返回值指针
返回值:void
**********************************************************************************/
void ADC_ReadChannel(ADC_MemMapPtr adc,int8u_t channel, int16u_t * result)
{
int32u_t readReg = 0;
readReg = ADC_SC1_REG(adc,0);
readReg &= ~ADC_SC1_ADCH_MASK;
readReg |= ADC_SC1_ADCH(channel);
ADC_SC1_REG(adc,0) = readReg;//设置ADC采样通道
while(!(ADC_SC1_REG(adc,0)&ADC_SC1_COCO_MASK));//等待ADC转换结束
*result = ADC_R_REG(adc,0);//读取ADC结果寄存器
}
/*************************************主函数***********************************/
void main(void)
{
System_Init();//系统初始化
EnableInterrupts();//开总中断
//GPIO_SetPinMod(PORTB,2,1);//PORTB,2,3特殊功能号2对应I2C功能
//GPIO_SetPinMod(PORTB,3,1);
//GPIO_SetPinDir(PORTB,2,1);
//GPIO_SetPinDir(PORTB,3,1);
while (1)
{
Zeroth_bit = GPIO_get(PORTC, 17);//读取拨码盘状态
First_bit = GPIO_get(PORTC, 16);
Second_bit = GPIO_get(PORTC, 15);
Third_bit = GPIO_get(PORTC, 14);
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
10届省赛直立电磁程序-K10.zip
(6.09 MB, 下载次数: 112)
2018-4-28 19:40 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
awdrgzscfb0
时间:
2018-5-6 16:24
666感谢楼主分享
作者:
awdrgzscfb000
时间:
2018-5-21 17:43
感谢分享 好东西!!!
作者:
z7534163
时间:
2018-10-13 10:56
新手,学习学习啊~~~~~~~~~~~··
作者:
qq646926493
时间:
2019-1-1 18:19
谢谢楼主分享~
作者:
苹果谢谢
时间:
2019-3-3 08:28
好东西,谢谢分享
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1