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

📄 adc_isr.c

📁 基于SPMC75的变频电机驱动例子,相当于一个简单的变频器. 望对变频器开发的工程式师有一定的帮助!
💻 C
字号:
#include "Spmc75_regs.h"
#include "mcMACRO.h"
#include "Backup_VAR.h"
#include "BCD-BIN.h"

unsigned int ADC_Buffer[3];
//滑动平均缓冲区
unsigned int ADC_Queue_Buffer[16];
unsigned int ADC_Queue_Add;
int ADC_Queue_NUM;

unsigned int DC_BUS_Voltage;
unsigned int Moto_Current;
unsigned int ADC_F_Buffer = 0;


void ADC_Init(void)
{
	int i;
	P_IOA_Dir->W &= 0xffe3;
	P_IOA_Attrib->W |= 0x001c;
	P_IOA_Buffer->W |= 0x001c;
	P_ADC_Channel->W = 0x001c;
	P_ADC_Setup->B.ADCCS = CB_ADC_ADCCS_Select;
	P_ADC_Setup->B.ADCEN = CB_ADC_ADCEN;
	P_ADC_Setup->B.ADCFS = CB_ADC_ADCFS_CPUCLKdiv64;
	P_ADC_Ctrl->B.ADCCHS = CB_ADC_ADCCHS_Ch2;
	ADC_Queue_NUM = 0;
	ADC_Queue_Add = 0;
	for(i = 0;i < 16;i ++)
		ADC_Queue_Buffer[i] = 0;
}

//=============================================================
// ----Function: void ADC_conversion(void);
// -Description: ADC转换服务
// --Parameters: None
// -----Returns: None
// -------Notes: 建议10ms采样一次
//=============================================================
void ADC_conversion(void)
{
	P_ADC_Ctrl->B.ADCCHS = 2;				//电流采集
	P_ADC_Ctrl->B.ADCSTR = 1;
	while((P_ADC_Ctrl->W & 0x0080) == 0);
	ADC_Buffer[0] = 65472 - P_ADC_Data->W;
	
	P_ADC_Ctrl->B.ADCCHS = 3;				//电压采集
	P_ADC_Ctrl->B.ADCSTR = 1;
	while((P_ADC_Ctrl->W & 0x0080) == 0);
	ADC_Buffer[1] = 65472 - P_ADC_Data->W;
	//根据设置进行下面的转换
	if(F_CH_Set == 1)
	{
		P_ADC_Ctrl->B.ADCCHS = 4;
		P_ADC_Ctrl->B.ADCSTR = 1;
		while((P_ADC_Ctrl->W & 0x0080) == 0);
		ADC_Buffer[2] = P_ADC_Data->W >> 6;
	}
}

void ADC_Acc(void)
{
	unsigned int Data_Temp;
	Moto_Current = MUL_DIV(ADC_Buffer[1],Current_Define,3200);		//负载电流 ( *100)
	DC_BUS_Voltage = MUL_DIV(ADC_Buffer[0],Voltage_Define,2100);	//干线电压
	if(F_CH_Set == 1)												//滑动平均
	{
		ADC_Queue_Add -= ADC_Queue_Buffer[ADC_Queue_NUM];
		ADC_Queue_Add += ADC_Buffer[2];
		ADC_Queue_Buffer[ADC_Queue_NUM] = ADC_Buffer[2];
		ADC_Queue_NUM ++;
		if(ADC_Queue_NUM > 15) ADC_Queue_NUM = 0;

		Data_Temp = DIV16(ADC_Queue_Add,16);
		if(Data_Temp > 0x0400) Data_Temp = 0x0400;					//防止计算溢出
			//频率值计算并存入寄存器 计算为( *100)格式
		Data_Temp = MUL_L_Shift6(UP_END_F,Data_Temp);				//获得当前模拟设置的频率值
		ADC_F_Buffer = Data_Temp;
	}
}

⌨️ 快捷键说明

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