STM32F4 DMA传输PWM 利用ADC测量显示

STM32F4 DMA传输PWM 利用ADC测量显示

Talk is cheap ,show me your code !!!

main.c

#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "dma.h"
#include "PWM.h"
#include "led.h"
#include "lcd.h"
#include "adc.h"

#define size 100

u16 send_buf[size];
u16 adcx;
u8  key;
int main()
  {
	 float temp;
	 int i,j;

	 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	 delay_init(168);
	 uart_init(9600);
	 TFTLCD_Init();		
	 LED_Init();	
	 KEY_Init();
	 Tim4Ch1Pwm(1024,79);
	 Adc_Init();
	 LCD_ShowString(30,190,200,16,16,"ADC VOL:0.000V");
		
   DMAx_Init(DMA1_Stream0, DMA_Channel_2,(u32)&TIM4->CCR1,(u32)send_buf,size);
		
	for(i=0; i<size; ++i)
		{
		 if(i!=size-1)
		 {
			 send_buf[i] = 100+10*i;
		   printf("%d\r\n",send_buf[i]); 	
		 }
		 else
			 send_buf[i] = 0;
		}
		
	while(1)
	{
		j++;
		if(j%20==0)
		{
		  LED0=!LED0;
		  delay_ms(30);
		}	
		
			adcx=Get_Adc_Average(ADC_Channel_5,5); //µÃµ½ADCת»»Öµ	  
			temp=(float)adcx*(3.3/4096);			      //µÃµ½ADCµçѹֵ
			adcx=temp;
 			LCD_ShowxNum(94,190,temp,1,16,0);     	//ÏÔʾµçѹֵÕûÊý²¿·Ö
 			temp-=adcx;
			temp*=1000;
			LCD_ShowxNum(110,190,temp,3,16,0x80); 	//ÏÔʾµçѹֵµÄСÊý²¿·Ö
	   
		key=KEY_Scan(0);	
		
		if(key==2)
		{
		  LED0=1;
		 while (1)
		 { 
	//  printf("\r\nDMA DATA:\r\n"); 	    
			LCD_ShowString(30,150,200,16,16,"Start Transimit....");
			adcx=Get_Adc_Average(ADC_Channel_5,5); //µÃµ½ADCת»»Öµ	  
			temp=(float)adcx*(3.3/4096);			      //µÃµ½ADCµçѹֵ
			adcx=temp;
 			LCD_ShowxNum(94,190,temp,1,16,0);     	//ÏÔʾµçѹֵÕûÊý²¿·Ö
 			temp-=adcx;
			temp*=1000;
			LCD_ShowxNum(110,190,temp,3,16,0x80); 	//ÏÔʾµçѹֵµÄСÊý²¿·Ö
      TIM_Cmd(TIM4, ENABLE);
			TIM_DMACmd(TIM4,TIM_DMA_CC1,ENABLE);
			DMAx_Enable(DMA1_Stream0,size);
			 
		   if(DMA_GetFlagStatus(DMA1_Stream0,DMA_FLAG_TCIF2)!=0)
			 {
				 printf("\r\n´«ÊäÍê:\r\n"); 
			   DMA_ClearFlag(DMA1_Stream0,DMA_FLAG_TCIF2);
				 LED1=1;
				 break;
			 }
			 	LED1=!LED1;
				delay_ms(300);
		 }

		}

	}
		
}
	

dma.c

#include "dma.h"

void DMAx_Init(DMA_Stream_TypeDef *DMA_Streamx, u32 chx,u32 par,u32 mar,u16 ndtr)
  {
	  DMA_InitTypeDef DMA_InitStructure;
		
		if((u32)DMA_Streamx>(u32)DMA2)
		{
		  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);
		}
		else 
		{
		RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);
		}
	  DMA_DeInit(DMA_Streamx);
		
		while(DMA_GetCmdStatus(DMA_Streamx)!=DISABLE) 
		{}
			
	DMA_InitStructure.DMA_Channel = chx;
  DMA_InitStructure.DMA_PeripheralBaseAddr = par;
  DMA_InitStructure.DMA_Memory0BaseAddr = mar;
  DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
  DMA_InitStructure.DMA_BufferSize = ndtr;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
			
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
	DMA_InitStructure.DMA_Mode = DMA_Mode_Circular  ;
	DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
	DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
	DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
	DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
	DMA_Init(DMA_Streamx,&DMA_InitStructure);
			
			
	}
	
void DMAx_Enable(DMA_Stream_TypeDef *DMA_Streamx, u16 ndtr)
  {
		
	 DMA_Cmd(DMA_Streamx, DISABLE);

	 while (DMA_GetCmdStatus(DMA_Streamx)!= DISABLE){}
	 
	 DMA_SetCurrDataCounter(DMA_Streamx,ndtr);
	
	 DMA_Cmd(DMA_Streamx,ENABLE);
		 

	}


	
 	

pwm.c

#include "PWM.h"
#include "usart.h"


void Tim4Ch1Pwm(u32 arr, u32 psc)
 {
    GPIO_InitTypeDef GPIO_InitStructure;
	  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	  TIM_OCInitTypeDef TIM_OCInitStructure;
	  
	  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
	  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
	 
	 
	  GPIO_PinAFConfig(GPIOD,GPIO_PinSource12,GPIO_AF_TIM4);
	  
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;	//ËÙ¶È100MHz
	  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //ÍÆÍ츴ÓÃÊä³ö
	  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;        //ÉÏÀ­
	  GPIO_Init(GPIOD,&GPIO_InitStructure);              //³õʼ»¯PD12	 
	 

	  TIM_TimeBaseStructure.TIM_Prescaler = psc;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseStructure.TIM_Period = arr;
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    
		TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);
	 
	  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
		TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
		TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
		TIM_OC1Init(TIM4,&TIM_OCInitStructure);
		
		TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
		
		TIM_ARRPreloadConfig(TIM4,ENABLE);
		
		
 

 }
 
 
  

adc.c

#include "adc.h"
#include "delay.h"		 
//	 


// 	


//³õʼ»¯ADC
//ÕâÀïÎÒÃǽöÒÔ¹æÔòͨµÀΪÀý
//ÎÒÃÇĬÈϽö¿ªÆôͨµÀ1																	   
void  Adc_Init(void)
{    
 
  GPIO_InitTypeDef  GPIO_InitStructure;
	ADC_CommonInitTypeDef ADC_CommonInitStructure;
	ADC_InitTypeDef       ADC_InitStructure;
	
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//ʹÄÜGPIOAʱÖÓ
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//ʹÄÜADC1ʱÖÓ

//Ïȳõʼ»¯IO¿Ú
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//Ä£ÄâÊäÈë
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//ÏÂÀ­
  GPIO_Init(GPIOA, &GPIO_InitStructure);//³õʼ»¯  
 
	RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);	//ADC1¸´Î»
	RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);	//¸´Î»½áÊø	 
 
 
  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//¶ÀÁ¢Ä£Ê½
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //DMAʧÄÜ
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2; 
  ADC_CommonInit(&ADC_CommonInitStructure);
	
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12λģʽ
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;//·ÇɨÃèģʽ	
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//½ûÖ¹´¥·¢¼ì²â£¬Ê¹ÓÃÈí¼þ´¥·¢
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//ÓÒ¶ÔÆë	
  ADC_InitStructure.ADC_NbrOfConversion = 1;//1¸öת»»ÔÚ¹æÔòÐòÁÐÖÐ Ò²¾ÍÊÇֻת»»¹æÔòÐòÁÐ1 
  ADC_Init(ADC1, &ADC_InitStructure);
	
 
	ADC_Cmd(ADC1, ENABLE);//¿ªÆôADת»»Æ÷	 
}				  
//»ñµÃADCÖµ
//ch:ͨµÀÖµ 0~16
//·µ»ØÖµ:ת»»½á¹û
u16 Get_Adc(u8 ch)   
{
	  	//ÉèÖÃÖ¸¶¨ADCµÄ¹æÔò×éͨµÀ£¬Ò»¸öÐòÁУ¬²ÉÑùʱ¼ä
	ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_480Cycles );	//ADC1,ADCͨµÀ,480¸öÖÜÆÚ,Ìá¸ß²ÉÑùʱ¼ä¿ÉÒÔÌá¸ß¾«È·¶È			    
  
	ADC_SoftwareStartConv(ADC1);		//ʹÄÜÖ¸¶¨µÄADC1µÄÈí¼þת»»Æô¶¯¹¦ÄÜ	
	 
	while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//µÈ´ýת»»½áÊø

	return ADC_GetConversionValue(ADC1);	//·µ»Ø×î½üÒ»´ÎADC1¹æÔò×éµÄת»»½á¹û
}
//»ñȡͨµÀchµÄת»»Öµ£¬È¡times´Î,È»ºóƽ¾ù 
//ch:ͨµÀ±àºÅ
//times:»ñÈ¡´ÎÊý
//·µ»ØÖµ:ͨµÀchµÄtimes´Îת»»½á¹ûƽ¾ùÖµ
u16 Get_Adc_Average(u8 ch,u8 times)
{
	u32 temp_val=0;
	u8 t;
	for(t=0;t<times;t++)
	{
		temp_val+=Get_Adc(ch);
		delay_ms(5);
	}
	return temp_val/times;
} 
	 











  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值