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
|