ADC采样通过ePWM1输出

f28027
说明
`AD通过通道一采样3.3v电压,触发方式设为ePWM1A触发,采到电压数值应为2的12次方

ePWM的顶端值设为 采样的3倍,则输出波形为 占空比为66.6%

ePWM配置的地方 在PWM子程序中写入
比较值:


	// Counter Compare Submodule Registers
	(*ePWM[1]).CMPA.half.CMPA =4096;				// set duty 0% initially
	(*ePWM[1]).CMPB = 0;						// set duty 0% initially
	(*ePWM[1]).CMPCTL.bit.SHDWAMODE = CC_SHADOW;   //Shadow mode
	(*ePWM[1]).CMPCTL.bit.LOADAMODE = CC_CTR_PRD;

占空比设置

	//配置计数点占空比
	// Action Qualifier SubModule Registers
	(*ePWM[1]).AQCTLA.bit.ZRO = AQ_CLEAR;//Set: force EPWMxA output high.   0点置零
	(*ePWM[1]).AQCTLA.bit.CAU = AQ_SET;//Action when the counter equals     比较点置1
                                         //the active CMPA register,Clear: force EPWMxA output low.
	(*ePWM[1]).AQCTLB.bit.ZRO = AQ_NO_ACTION;
	(*ePWM[1]).AQCTLB.bit.CAU = AQ_NO_ACTION;
	(*ePWM[1]).AQCTLB.bit.PRD = AQ_NO_ACTION;![在这里插入图片描述](https://img-blog.csdnimg.cn/20190715150819799.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMDMzNTQ3,size_16,color_FFFFFF,t_70)

在主函数中写入

	// Configure ePWM
		PWM_1ch_CNF(12288);//  顶端值
		EPwm1Regs.ETSEL.bit.SOCAEN  =  1;//Enable EPWMxSOCA pulse
		EPwm1Regs.ETSEL.bit.SOCASEL =  ET_CTR_ZERO; // Use CTR = ZRO events as trigger
	    EPwm1Regs.ETPS.bit.SOCAPRD = 1; 	        // Generate pulse on 1st event

主函数为

/*
 * main.c
 */

#include "PeripheralHeaderIncludes.h"
#include "F2802x_EPWM_defines.h"

#define ADCTRIG_EPWM1_SOCA 5
volatile struct EPWM_REGS EPwm1Regs;
volatile struct EPWM_REGS EPwm2Regs;
volatile struct EPWM_REGS EPwm3Regs;
volatile struct EPWM_REGS EPwm4Regs;
// ADC声明
// Used for ADC Configuration
int 	ChSel[16] =   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int		TrigSel[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int     ACQPS[16] =   {8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8};
void ADC_SOC_CNF(int ChSel[], int Trigsel[], int ACQPS[], int IntChSel, int mode);

//pwm声明
void PWM_1ch_CNF(int16 period);

// Used to indirectly access all EPWM modules
volatile struct EPWM_REGS *ePWM[] =
   { &EPwm1Regs,                                              //intentional: (ePWM[0] not used)
	 &EPwm1Regs,
	 &EPwm2Regs,
	 &EPwm3Regs,
	 &EPwm4Regs,
	 #if (!DSP2802x_DEVICE_H)
 	 &EPwm5Regs,
	 &EPwm6Regs,
	 #if (DSP2803x_DEVICE_H || DSP2804x_DEVICE_H)
	 &EPwm7Regs,
	 #if (DSP2804x_DEVICE_H)
	 &EPwm8Regs
	 #endif
	 #endif
	 #endif
   };






int main(void) {

	// Configure ADC
	ChSel[0] = 6;
	TrigSel[0] = ADCTRIG_EPWM1_SOCA;
	ACQPS [0]= 6;

	ADC_SOC_CNF(ChSel,TrigSel,ACQPS, 16, 0);	// Mode= Start/Stop (0)
  	// Configure SOC event generation at PWM level


	// Configure ePWM
		PWM_1ch_CNF(12288);//  顶端值
		EPwm1Regs.ETSEL.bit.SOCAEN  =  1;//Enable EPWMxSOCA pulse
		EPwm1Regs.ETSEL.bit.SOCASEL =  ET_CTR_ZERO; // Use CTR = ZRO events as trigger
	    EPwm1Regs.ETPS.bit.SOCAPRD = 1; 	        // Generate pulse on 1st event




	return 0;
}

ADC的配置函数

//----------------------------------------------------------------------------------
//	FILE:			ADC_SOC_CNF.c.c
//
//	Description:	ADC configuration to support up to 16 conversions on 
//					Start of Conversion(SOC) based ADCs (type 3) found on F2802x and 
// 					F3803x devices.  Independent selection of Channel, Trigger and 
// 					acquisition window using ChSel[],TrigSel[] and ACQPS[].
//
//  Dependencies:  Assumes the {DeviceName}-usDelay.asm is inlcuded in the project   
//	Version: 		3.0
//
//  Target:  		TMS320F2802x(PiccoloA), 
//					TMS320F2803x(PiccoloB), 
//
//  The function call is: 
//		
//		void ADC_SOC_CNF(int ChSel[], int Trigsel[], int ACQPS[], int IntChSel, int mode)
//
// Function arguments defined as:
//-------------------------------
// ChSel[]  = 	Channel selection made via a channel # array passed as an argument
// TrigSel[]= 	Source for triggering conversion of a channel, 
//			  	selection made via a trigger # array passed as argument
// ACQPS[]  = 	AcqWidth is the S/H aperture in #ADCCLKS,# array passed as argument
// IntChSel = 	Channel number that would trigger an ADC Interrupt 1 on completion(EOC)
//			    if no channel triggers ADC interrupt pass value > 15
// Mode 	= 	Operating mode: 	0 = Start / Stop mode, needs trigger event
//                             		1 = Continuous mode, no trigger needed
//									2 = CLA Mode, start stop mode with auto clr INT Flag
//================================================================================
#include "PeripheralHeaderIncludes.h"

#include "F2802x_Adc.h"

volatile struct ADC_REGS AdcRegs;

void ADC_SOC_CNF(int ChSel[], int Trigsel[], int ACQPS[], int IntChSel, int mode)
{

	extern void DSP28x_usDelay(Uint32 Count);

 
	EALLOW;
	AdcRegs.ADCCTL1.bit.ADCREFSEL	= 0;    //内部/外部参考选择,  0:内部能带隙用于参考源的产生
   	AdcRegs.ADCCTL1.bit.ADCBGPWD	= 1;	// Power up band gap   内核内的能带隙缓冲电路上电
   	AdcRegs.ADCCTL1.bit.ADCREFPWD	= 1;	// Power up reference   内核内的参考缓冲电路断电
   	AdcRegs.ADCCTL1.bit.ADCPWDN 	= 1;	// Power up rest of ADC
	AdcRegs.ADCCTL1.bit.ADCENABLE	= 1;	// Enable ADC

	DSP28x_usDelay(1000);         // Delay before converting ADC channels

	AdcRegs.ADCCTL1.bit.INTPULSEPOS	= 1;    //中断脉冲在ADC结果锁存到结果寄存器的前一个周期产生

	AdcRegs.ADCSOC0CTL.bit.ACQPS = ACQPS[0];   //控制SOCx的采样和保持窗口。最小允许值为6。  ,, 8,,采样窗口为9个周期的长度
   	AdcRegs.ADCSOC1CTL.bit.ACQPS = ACQPS[1];
   	AdcRegs.ADCSOC2CTL.bit.ACQPS = ACQPS[2];
   	AdcRegs.ADCSOC3CTL.bit.ACQPS = ACQPS[3];
   	AdcRegs.ADCSOC4CTL.bit.ACQPS = ACQPS[4];
   	AdcRegs.ADCSOC5CTL.bit.ACQPS = ACQPS[5];
   	AdcRegs.ADCSOC6CTL.bit.ACQPS = ACQPS[6];
   	AdcRegs.ADCSOC7CTL.bit.ACQPS = ACQPS[7];
   	AdcRegs.ADCSOC8CTL.bit.ACQPS = ACQPS[8];
   	AdcRegs.ADCSOC9CTL.bit.ACQPS = ACQPS[9];
   	AdcRegs.ADCSOC10CTL.bit.ACQPS = ACQPS[10];
   	AdcRegs.ADCSOC11CTL.bit.ACQPS = ACQPS[11];
   	AdcRegs.ADCSOC12CTL.bit.ACQPS = ACQPS[12];
   	AdcRegs.ADCSOC13CTL.bit.ACQPS = ACQPS[13];
   	AdcRegs.ADCSOC14CTL.bit.ACQPS = ACQPS[14];
   	AdcRegs.ADCSOC15CTL.bit.ACQPS = ACQPS[15];

	AdcRegs.INTSEL1N2.bit.INT1SEL = IntChSel;		// IntChSel=16,  IntChSel causes ADCInterrupt 1   ,ADCINTx EOC源选择 ,16,无效值
	                                                // INTSEL1N2,,中断选择1和2寄存器(INTSEL1N2)(地址偏移量08h)

	if (mode == 0)		// Start-Stop conv mode    模式选择,
	{
		AdcRegs.ADCINTFLG.bit.ADCINT1 = 0;  // clear interrupt flag for ADCINT1
		AdcRegs.INTSEL1N2.bit.INT1CONT = 0;	// clear ADCINT1 flag to begin a new set of conversions
		                                    //0:在ADCINTx标志(ADCINTFLG寄存器)被用户清除前,没有另外的 ADCINTx边沿产生。
	   	AdcRegs.ADCINTSOCSEL1.all=0x0000;	// No ADCInterrupt will trigger SOCx,,没有ADCINT能触发SOCx。TRIGSEL字段决定了SOCx的触发源
	   	AdcRegs.ADCINTSOCSEL2.all=0x0000;
	}
	if (mode == 1)		// Continuous conv mode
	{
		AdcRegs.INTSEL1N2.bit.INT1CONT = 1;	// set ADCInterrupt 1 to auto clr   1:无论EOC边沿何时产生都将产生ADCINTx边沿(不考虑标志位是否清零)
		AdcRegs.ADCINTSOCSEL1.all=0xFF;// ADCInterrupt 1 will trigger SOCx, TrigSel is ignored
		AdcRegs.ADCINTSOCSEL2.all=0xFF;
	}

	if (mode == 2)		// CLA mode, Start Stop ADC with auto clr ADC Flag
	{
		AdcRegs.ADCINTFLG.bit.ADCINT1 = 0;  // clear interrupt flag for ADCINT1
		AdcRegs.INTSEL1N2.bit.INT1CONT = 1;	// set ADCInterrupt 1 to auto clr
		AdcRegs.ADCINTSOCSEL1.all=0x0000;	// No ADCInterrupt will trigger SOCx
	   	AdcRegs.ADCINTSOCSEL2.all=0x0000;
	}

	if(IntChSel<15)
		AdcRegs.INTSEL1N2.bit.INT1E = 1;		// enable ADC interrupt 1
	else
		AdcRegs.INTSEL1N2.bit.INT1E = 0;		// disable the ADC interrupt 1

// Select the channel to be converted when SOCx is received
	AdcRegs.ADCSOC0CTL.bit.CHSEL= ChSel[0];   //选择被转换的通道。
	AdcRegs.ADCSOC1CTL.bit.CHSEL= ChSel[1];
	AdcRegs.ADCSOC2CTL.bit.CHSEL= ChSel[2];
	AdcRegs.ADCSOC3CTL.bit.CHSEL= ChSel[3];
	AdcRegs.ADCSOC4CTL.bit.CHSEL= ChSel[4];
	AdcRegs.ADCSOC5CTL.bit.CHSEL= ChSel[5];
	AdcRegs.ADCSOC6CTL.bit.CHSEL= ChSel[6];
	AdcRegs.ADCSOC7CTL.bit.CHSEL= ChSel[7];
	AdcRegs.ADCSOC8CTL.bit.CHSEL= ChSel[8];
	AdcRegs.ADCSOC9CTL.bit.CHSEL= ChSel[9];
	AdcRegs.ADCSOC10CTL.bit.CHSEL= ChSel[10];
	AdcRegs.ADCSOC11CTL.bit.CHSEL= ChSel[11];
	AdcRegs.ADCSOC12CTL.bit.CHSEL= ChSel[12];
	AdcRegs.ADCSOC13CTL.bit.CHSEL= ChSel[13];
	AdcRegs.ADCSOC14CTL.bit.CHSEL= ChSel[14];
	AdcRegs.ADCSOC15CTL.bit.CHSEL= ChSel[15];


	AdcRegs.ADCSOC0CTL.bit.TRIGSEL= Trigsel[0];  //SOCx触发源选择   ,sampling triggered by EPWM1 SOCA
	AdcRegs.ADCSOC1CTL.bit.TRIGSEL= Trigsel[1];
	AdcRegs.ADCSOC2CTL.bit.TRIGSEL= Trigsel[2];
	AdcRegs.ADCSOC3CTL.bit.TRIGSEL= Trigsel[3];
	AdcRegs.ADCSOC4CTL.bit.TRIGSEL= Trigsel[4];
	AdcRegs.ADCSOC5CTL.bit.TRIGSEL= Trigsel[5];
	AdcRegs.ADCSOC6CTL.bit.TRIGSEL= Trigsel[6];
	AdcRegs.ADCSOC7CTL.bit.TRIGSEL= Trigsel[7];
	AdcRegs.ADCSOC8CTL.bit.TRIGSEL= Trigsel[8];
	AdcRegs.ADCSOC9CTL.bit.TRIGSEL= Trigsel[9];
	AdcRegs.ADCSOC10CTL.bit.TRIGSEL= Trigsel[10];
	AdcRegs.ADCSOC11CTL.bit.TRIGSEL= Trigsel[11];
	AdcRegs.ADCSOC12CTL.bit.TRIGSEL= Trigsel[12];
	AdcRegs.ADCSOC13CTL.bit.TRIGSEL= Trigsel[13];
	AdcRegs.ADCSOC14CTL.bit.TRIGSEL= Trigsel[14];
	AdcRegs.ADCSOC15CTL.bit.TRIGSEL= Trigsel[15];
	EDIS;

	AdcRegs.ADCSOCFRC1.all = 0xFFFF;		// kick-start ADC   1:清除SOCx溢出标志

}

ePWM的配置

#include "PeripheralHeaderIncludes.h"
#include "F2802x_EPWM_defines.h"
extern volatile struct EPWM_REGS *ePWM[];


void PWM_1ch_CNF(int16 period)
{
	// Time Base SubModule Registers	
	(*ePWM[1]).TBCTL.bit.PRDLD = TB_IMMEDIATE;	// set Immediate load
	                                           //Load the TBPRD register immediately
	                                          //without using a shadow register
	(*ePWM[1]).TBPRD = period-1;					// PWM frequency = 1 / period
	(*ePWM[1]).TBPHS.half.TBPHS = 0;                //Set Phase register to zero
	(*ePWM[1]).TBCTR = 0;                           // clear TB counter
	(*ePWM[1]).TBCTL.bit.CTRMODE = TB_COUNT_UP;     //Up-count mode
	(*ePWM[1]).TBCTL.bit.HSPCLKDIV = TB_DIV1;     //TBCLK = SYSCLKOUT / (HSPCLKDIV × CLKDIV)
	(*ePWM[1]).TBCTL.bit.CLKDIV = TB_DIV1;       //TBCLK = SYSCLKOUT / (HSPCLKDIV × CLKDIV)
                                                //通过上面设置后TBCLK = SYSCLKOUT


	(*ePWM[1]).TBCTL.bit.PHSEN = TB_DISABLE; // Do not load the time-base counter (TBCTR) from
	                                        // the time-base phase register (TBPHS)
	(*ePWM[1]).TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // CTR = zero: Time-base counter
                                                 // equal to zero (TBCTR = 0x0000)

	// Counter Compare Submodule Registers
	(*ePWM[1]).CMPA.half.CMPA =4096;				// set duty 0% initially
	(*ePWM[1]).CMPB = 0;						// set duty 0% initially
	(*ePWM[1]).CMPCTL.bit.SHDWAMODE = CC_SHADOW;   //Shadow mode
	(*ePWM[1]).CMPCTL.bit.LOADAMODE = CC_CTR_PRD;



	//配置计数点占空比
	// Action Qualifier SubModule Registers
	(*ePWM[1]).AQCTLA.bit.ZRO = AQ_CLEAR;//Set: force EPWMxA output high.   0点
	(*ePWM[1]).AQCTLA.bit.CAU = AQ_SET;//Action when the counter equals     比较点
                                         //the active CMPA register,Clear: force EPWMxA output low.
	(*ePWM[1]).AQCTLB.bit.ZRO = AQ_NO_ACTION;
	(*ePWM[1]).AQCTLB.bit.CAU = AQ_NO_ACTION;
	(*ePWM[1]).AQCTLB.bit.PRD = AQ_NO_ACTION;

}


示波器波形如图
在这里插入图片描述

出的问题

1.头文件 按照出的错误一个个找到添加
2.移植函数的时候只yi要用的就行
3.28027
在这里插入图片描述
否则就会出现
C28xx: Failed to remove the debug state from the target before disconnecting. There may still be breakpoint op-codes embedded in program memory. It is recommended that you reset the emulator before you connect and reload your program before you continue debugging

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值