ZYNQでADCの値に応じてPWM出力を調整


制約ファイル

set_property IOSTANDARD LVCMOS33 [get_ports vauxn0]
set_property IOSTANDARD LVCMOS33 [get_ports vauxp0]
set_property IOSTANDARD LVCMOS33 [get_ports vauxn1]
set_property IOSTANDARD LVCMOS33 [get_ports vauxp1]
set_property IOSTANDARD LVCMOS33 [get_ports vauxn8]
set_property IOSTANDARD LVCMOS33 [get_ports vauxp8]
set_property IOSTANDARD LVCMOS33 [get_ports vauxn9]
set_property IOSTANDARD LVCMOS33 [get_ports vauxp9]
set_property IOSTANDARD LVCMOS33 [get_ports vn_in]
set_property IOSTANDARD LVCMOS33 [get_ports vp_in]

set_property IOSTANDARD LVCMOS33 [get_ports PWM0]
set_property PACKAGE_PIN U13 [get_ports PWM0]
#include <stdio.h>
#include "platform.h"
#include "xsysmon.h"
#include "xparameters.h"
#include "xil_io.h"

#define MY_PWM 0x43C10000

#define SYSMON_DEVICE_ID XPAR_SYSMON_0_DEVICE_ID //ID of xadc_wiz_0
#define XSysMon_RawToExtVoltage(AdcData) \
		((((float)(AdcData))*(1.0f))/65536.0f) //(ADC 16bit result)/16/4096 = (ADC 16bit result)/65536
// voltage value = (ADC 16bit result)/65536 * 1Volt
static XSysMon SysMonInst; //a sysmon instance
static int SysMonFractionToInt(float FloatNum);

int main() {
	u8 SeqMode;
	u32 TempRawData,VccIntRawData,ExtVolRawData,i;
	float TempData,VccIntData,ExtVolData;
	int xStatus;
	XSysMon_Config *SysMonConfigPtr;
	XSysMon *SysMonInstPtr = &SysMonInst;
	init_platform();
	print("Hello World\n\r");
	//----------------------------------------------------------------------- SysMon Initialize
	SysMonConfigPtr = XSysMon_LookupConfig(SYSMON_DEVICE_ID);
	if(SysMonConfigPtr == NULL) printf("LookupConfig FAILURE\n\r");
	xStatus = XSysMon_CfgInitialize(SysMonInstPtr, SysMonConfigPtr,SysMonConfigPtr->BaseAddress);
	if(XST_SUCCESS != xStatus) printf("CfgInitialize FAILED\r\n");
	//-----------------------------------------------------------------------------------------

	XSysMon_GetStatus(SysMonInstPtr); // Clear the old status
	while(1)
	{ //wait until EOS activated
		while ((XSysMon_GetStatus(SysMonInstPtr) & XSM_SR_EOS_MASK) != XSM_SR_EOS_MASK);
		ExtVolRawData = XSysMon_GetAdcData(SysMonInstPtr,XSM_CH_AUX_MIN+1); //Read the external Vaux0 Data
		ExtVolData = XSysMon_RawToExtVoltage(ExtVolRawData);
		Xil_Out32(MY_PWM, (int)1024*ExtVolData);

	}
	return 0;
}

//----------------------------------------------------------------------------------------------
int SysMonFractionToInt(float FloatNum) {
	float Temp;
	Temp = FloatNum;
	if (FloatNum < 0) {
		Temp = -(FloatNum);
	}

	return( ((int)((Temp -(float)((int)Temp)) * (1000.0f))));
}