#include "stm32f10x.h"
#define DAC_DHR12RD_Address 0x40007420 //DAC地址
DAC_InitTypeDef DAC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
uint32_t LeftNum;
uint32_t ADC1_val0[10];
uint32_t ADC2_val0[10];
uint32_t ADC1_val90[10];
uint32_t ADC2_val90[10];
uint32_t x=0;
uint32_t Re_sum=0;
uint32_t Im_sum=0;
uint32_t Re_average=0;
float Im_average=0;
uint32_t Cap;
uint32_t L;
const uint16_t Sine12bit[64]={//正弦波生成
2047,2248,2447,2642,2831,3012,3185,3346,3495,3630,3750,3853,3939,4007,4056,4085,4095,
4085,4056,4007,3853,3750,3630,3495,3346,3185,3012,2831,2642,2447,2248,2047,1846,1647,
1452,1263,1082,909,748,599,464,344,241,155,87,38,9,0,9,38,87,155,241,344,464,599,748,
909,1082,1263,1452,1647,1846,2047
};
/* 函数声明 -----------------------------------------------*/
void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART_Configuration(void);
void NVIC_Configuration(void);
void ADC_Configuration(void);
void DAC_Configuration(void);
int main(void)
{
int i;
int Re[10],Im[10];
RCC_Configuration();
GPIO_Configuration();
USART_Configuration();
NVIC_Configuration();
DAC_Configuration();
ADC_Configuration();
while (1)
{
if(x==10)
{
x=0;
for(i=0;i<10;i++)
{
Re=-(ADC1_val0)/(-ADC2_val0);
Im=(ADC1_val0*(-ADC2_val90)-ADC1_val90*(-ADC2_val0))/
(ADC2_val0*ADC2_val0+ADC2_val90*ADC2_val90);
Re_sum+=Re;
Im_sum+=Im;
}
Re_average=(Re_sum/10);
Im_average=(float)(Im_sum/10);
Cap=((uint32_t)((-(1/(0.0001/(2*3.14159265)/Im_average)))*1000000000));//整数pF,1pF~1000uF
L=Im_average/(0.0001/(2*3.14159265));
USART_SendData(USART1, Re_average%65536/256);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);//判断是否发送完成。
USART_SendData(USART1, Re_average%65536%256);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);//判断是否发送完成。
USART_SendData(USART1, 0xCC); //分隔符CCCC
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);//判断是否发送完成。
USART_SendData(USART1, 0xCC);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);//判断是否发送完成。
//-------------------------------------------------------------------------------
USART_SendData(USART1, Cap%1000000%65536/256);//电容共6位,高3位
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);//判断是否发送完成。
USART_SendData(USART1, Cap%1000000%65536%256);//电容低3位
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);//判断是否发送完成。
USART_SendData(USART1, 0xFF); //分隔符FFFF
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);//判断是否发送完成。
USART_SendData(USART1, 0xFF);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);//判断是否发送完成。
}
}
}
void RCC_Configuration(void)
{
/////////DAC时钟//////////////
/* DMA2 时钟使能 */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
/* GPIOA Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/* DAC Periph clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
/* TIM2 Periph clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
//////////ADC1时钟和ADC2时钟//////////////
/* ADCCLK = PCLK2/4 */
RCC_ADCCLKConfig(RCC_PCLK2_Div4);//PCLK2四分频后作为ADC时钟(72÷4=18M)
/* ADC1和GPIOC时钟使能 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_ADC2 | RCC_APB2Periph_GPIOC, ENABLE);
//////串口时钟////////// a
RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 |RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA,ENABLE);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/***串口初始化***/
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //USART1 Tx
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure); //A端口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //USART1 Rx
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //输入浮空
GPIO_Init(GPIOA, &GPIO_InitStructure);//A端口
/* ADC初始化 PC.00 (ADC 通道10)、PC.01(ADC 通道11) 为模拟输入 -------------------------*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入
GPIO_Init(GPIOC, &GPIO_InitStructure);
/***DAC初始化***//*** 将PA.4和PA.5配置成AIN模式 ***/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void DAC_Configuration(void)
{
/* TIM2 Configuration */
/* Time base configuration */
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Period = 225;
TIM_TimeBaseStructure.TIM_Prescaler = 0x0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
/* TIM2 TRGO selection */
TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_Update);
/* DAC channel1 Configuration */
DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO;
DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
DAC_Init(DAC_Channel_1, &DAC_InitStructure);
/* DAC channel2 Configuration */
DAC_Init(DAC_Channel_2, &DAC_InitStructure);
/* DMA2 channel4 configuration */
DMA_DeInit(DMA2_Channel3);
DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12RD_Address; //外设基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&Sine12bit;//存储器基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;//外设是目标数据
DMA_InitStructure.DMA_BufferSize = 64; //32个数据
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址加
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//字(32位)
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//字(32位)
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //DMA工作在循环模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA优先级高
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //内存到内存,禁止
DMA_Init(DMA2_Channel3, &DMA_InitStructure); //DMA2的通道3,这个需要根据参考手册DMA2控制器的表60来确定,并不是随便写的!
/* 使能 DMA2 通道3 */
DMA_Cmd(DMA2_Channel3, ENABLE);
/* 使能DAC通道1 PA.04 */
DAC_Cmd(DAC_Channel_1, ENABLE);
/* Enable DMA for DAC Channel2 */
DAC_DMACmd(DAC_Channel_1, ENABLE);
/* TIM2 enable counter */
TIM_Cmd(TIM2,ENABLE);
}
/***【中断!】用NVIC务必要添加 misc.c 文件***/
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel=DMA2_Channel3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void ADC_Configuration(void)
{
ADC_InitTypeDef ADC_InitStructure;//定义ADC结构体变量
/* ADC1 configuration
------------------------------------------------------*/
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC1和ADC2工作在独立模式(非双ADC模式)
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //非扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //非连续模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //不用外部触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //ADC通道数
ADC_Init(ADC1,&ADC_InitStructure); //ADC1按上面的设置开始初始化
ADC_Init(ADC2,&ADC_InitStructure); //ADC2按上面的设置开始初始化
/* ADC1 规则通道10配置 */
//设置规则通道组通道14的转换顺序和转换时间
//参数1表示是第1个转换,ADC通道14的采样周期为55.5周期
ADC_RegularChannelConfig(ADC1,ADC_Channel_10, 1, ADC_SampleTime_55Cycles5);
ADC_Cmd(ADC1,ENABLE); //ADC1上电(即ADON=1)
ADC_ResetCalibration(ADC1);//复位校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1));//复位校准寄存器结束
ADC_StartCalibration(ADC1); //开始校准
while(ADC_GetCalibrationStatus(ADC1)); //校准结束
ADC_SoftwareStartConvCmd(ADC1,ENABLE); //软件启动转换
/* ADC2 规则通道11配置 */
//设置规则通道组通道11的转换顺序和转换时间
//参数1表示是第1个转换,ADC通道11的采样周期为55.5周期
ADC_RegularChannelConfig(ADC2,ADC_Channel_11, 1, ADC_SampleTime_55Cycles5);
ADC_Cmd(ADC2,ENABLE); //ADC1上电(即ADON=1)
ADC_ResetCalibration(ADC2);//复位校准寄存器
while(ADC_GetResetCalibrationStatus(ADC2));//复位校准寄存器结束
ADC_StartCalibration(ADC2); //开始校准
while(ADC_GetCalibrationStatus(ADC2)); //校准结束
ADC_SoftwareStartConvCmd(ADC2,ENABLE); //软件启动转换
}
void USART_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 115200;//速率115200bps
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//数据位8位
USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位1位
USART_InitStructure.USART_Parity = USART_Parity_No;//无校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件流控
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发模式
USART_Init(USART1, &USART_InitStructure); //配置串口1参数
USART_Cmd(USART1, ENABLE);//使能 USART1
}
////////////////////////////////////////////
STM32F10X_IT.C
extern uint32_t LeftNum;
extern uint32_t ADC1_val0[10];
extern uint32_t ADC2_val0[10];
extern uint32_t ADC1_val90[10];
extern uint32_t ADC2_val90[10];
extern uint32_t x;
void DMA2_Channel3_IRQHandler(void)
{
x++;
LeftNum=DMA_GetCurrDataCounter(DMA2_Channel3);//返回当前DMA通道x剩余的待传输数据数目
if(LeftNum==63)
{
ADC_SoftwareStartConvCmd(ADC1,ENABLE); //启动AD转换
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)); //等待转换结束
ADC1_val0[x]=ADC_GetConversionValue(ADC1); //读取转换结果
ADC_SoftwareStartConvCmd(ADC2,ENABLE); //启动AD转换
while(!ADC_GetFlagStatus(ADC2,ADC_FLAG_EOC)); //等待转换结束
ADC2_val0[x]=ADC_GetConversionValue(ADC2); //读取转换结果
} if(LeftNum==47)
{
x++;
ADC_SoftwareStartConvCmd(ADC1,ENABLE); //启动AD转换
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)); //等待转换结束
ADC1_val90[x]=ADC_GetConversionValue(ADC1); //读取转换结果
ADC_SoftwareStartConvCmd(ADC2,ENABLE); //启动AD转换
while(!ADC_GetFlagStatus(ADC2,ADC_FLAG_EOC)); //等待转换结束
ADC2_val90[x]=ADC_GetConversionValue(ADC2); //读取转换结果
}
}
|