⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 电动机位置检测.c

📁 里面包含了基于dsp2812的永磁同步电动机和步进电动机的5个源程序。用c语言编的。
💻 C
字号:
#include "DSP28_Device.h"
#include "f28xqep.h"
#include "f28xbmsk.h"

void  F28X_EV1_QEP_Init(QEP *p)
{
 
          EvaRegs.CAPCON.all = QEP_CAP_INIT_STATE;     /*设置捕捉单元 */
          EvaRegs.T2CON.all = QEP_TIMER_INIT_STATE;    /*设置捕捉定时器*/
          EvaRegs.T2PR = 0xFFFF;
          EvaRegs.EVAIFRC.bit.CAP3INT = 1;     			/*清除CAP3标志*/
          EvaRegs.EVAIMRC.bit.CAP3INT = 1;     		/*使能CAP3中断*/
          GpioMuxRegs.GPAMUX.all |= 0x0700;    		/*配置捕捉单元的引脚*/
}    


void F28X_EV1_QEP_Calc(QEP *p)
{
     long tmp;

     p->dir_QEP = 0x4000&EvaRegs.GPTCONA.all;
     p->dir_QEP = p->dir_QEP>>14;
     
     p->theta_raw = EvaRegs.T2CNT + p->cal_angle;
     
     tmp = (long)(p->theta_raw*p->mech_scaler);  		/* Q0*Q26 = Q26 */
     tmp &= 0x03FFF000;
     p->theta_mech = (int)(tmp>>11);         			/* Q26 -> Q15 */
     p->theta_mech &= 0x7FFF;
	     
     p->theta_elec = p->pole_pairs*p->theta_mech;  		/* Q0*Q15 = Q15 */
     p->theta_elec &= 0x7FFF;
     
}

void F28X_EV1_QEP_Isr(QEP *p)
{

     p->QEP_cnt_idx = EvaRegs.T2CNT;
     EvaRegs.T2CNT = 0;
     p->index_sync_flag = 0x00F0;

}

//******************************************************************************
//    TMS320F2812电动机位置检测  QEP电路初始化参数及函数定义
//    文件名称:F28XQEP.H
//******************************************************************************
#ifndef __F28X_QEP_H__
#define __F28X_QEP_H__

#include "f28xbmsk.h"
/* 		初始化T2CON和CAPCON 		*/
#define QEP_CAP_INIT_STATE    0x9004
#define QEP_TIMER_INIT_STATE (FREE_RUN_FLAG +          \
                          TIMER_DIR_UPDN +         \
                          TIMER_CLK_PRESCALE_X_1 + \
                          TIMER_ENABLE_BY_OWN +    \
                          TIMER_ENABLE +           \
                          TIMER_CLOCK_SRC_QEP +    \
                          TIMER_COMPARE_LD_ON_ZERO)

/*  定义QEP (正交编码电路) 驱动的对象 */
typedef struct {int theta_elec;     	/* 输出: 电动机电角度(Q15)  						*/
                int theta_mech;    	/* 输出: 电动机机械角度(Q15)  						*/
                int dir_QEP;      	/* 输出: 电动机转动方向 (Q0)						*/
                int QEP_cnt_idx; 	/* 变量: 编码器计数(Q0)  						*/
                int theta_raw;     	/* 变量: 定时器2得出的角度(Q0)             		*/
                int mech_scaler;   	/* 参数: 0.9999/计数最大值,计数最大值 = 4000 (Q26) 	*/
                int pole_pairs;    	/* 参数: 极对数(Q0)  							*/
                int cal_angle;     	/* 参数: 编码器和相之间的角度偏移量 (Q0)			*/
                int index_sync_flag;	/* 输出: Index sync status (Q0)       					*/
                void (*init)();     	/* 初始化函数指针         						*/
                void (*calc)();     	/* 计算函数指针       							*/
                void (*isr)();      	/* 中断程序指针   								*/
                }  QEP;

/*		定义一个QEP_handle			*/
typedef QEP *QEP_handle;
#define QEP_DEFAULTS { 0x0, 0x0,0x0,0x0,0x0,16776,2,-2365,0x0,  \
                (void (*)(long))F28X_EV1_QEP_Init,            \
                (void (*)(long))F28X_EV1_QEP_Calc, 		   \
                (void (*)(long))F28X_EV1_QEP_Isr }
void F28X_EV1_QEP_Init(QEP_handle); 
void F28X_EV1_QEP_Calc(QEP_handle);
void F28X_EV1_QEP_Isr(QEP_handle);

#endif /*  __F28X_QEP_H__ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -