精华内容
下载资源
问答
  • 为有效预防火灾灾情恶化和实现自动灭火,本文设计了一种基于STM 32单片机的可无线报警与自动灭火的智能小车。本文具体阐述了该小车的制作原理,包括硬件组成和程序流程。首先对该小车的火灾识别、无线报警和自动灭火...
  • 设计选用STM32单片机作控制器,设计温度单反馈的控制系统,对电加热水器内水的温度进行控制。通过PT100温度传感器实现对水温信号的采集,并利用模拟量前向通道来对水温信号进行处理。利用STM32单片机进行控制输出PWM...
  • 包含源程序、原理图和论文等,毕业设计电路
  • 32单片机毕业设计

    2014-08-14 17:23:26
    包含一些单片机毕业设计 基于51单片机平台 虽然现在32位的单片机很火 初学者玩下51也不错
  • 基于STM32单片机的温室环境监测系统设计
  • 包含原理图、源程序、视频讲解、开题报告、论文及使用说明等
  • 基于STM32单片机的空气净化器毕业设计
  • 采用STM32单片机,4.3寸电容触摸屏,SD卡。本设计可实现菜单选择,可翻页,字体选择,背景设置,书签设置等功能。
  • 基于STM32的热水器设计,可以自动加水,自动放水,自动加热,可以通过按键设计加热时间,水位过低,自动上水。
  • 基于STM32单片机的智能鱼缸设计与研究
  • 单片机毕业设计之 -- 基于stm32的示波器设计

    千次阅读 多人点赞 2021-08-21 17:13:48
    大家可用于 课程设计 或 毕业设计 技术解答 毕设帮助:<Q>746876041 2 主要器件 3 实现效果 4 设计原理 学长设计的示波器采用了一套成本低廉但高效的硬件,配合层次化的软件框架,实现对常规低频信号波形...


    1 简介

    Hi,大家好,这里是丹成学长,今天向大家介绍一个学长做的单片机项目

    基于stm32的示波器设计

    大家可用于 课程设计 或 毕业设计

    2 主要器件

    在这里插入图片描述

    在这里插入图片描述

    3 实现效果

    在这里插入图片描述

    在这里插入图片描述

    4 设计原理

    学长设计的示波器采用了一套成本低廉但高效的硬件,配合层次化的软件框架,实现对常规低频信号波形的采集、分析、显示。

    硬件部分的主要工作有:电源管理(5V、2.5V、-5V);对信号的衰减、限幅、偏置。最后将处理好的电压信号送入MCU的ADC外设,进行数据采集。由于ADC外设只能采集正电压,因此我们通过增加偏置电压的方式,将负电压抬高来采集。

    软件部分的主要工作有:底层驱动SDK框架、ADC滤波算法、波形数据处理、人机交互界面。SDK提供基本的模块和外设驱动支持,滤波算法去除噪声和毛刺,波形处理计算电压值和频率,并为波形显示做准备;人机交互界面提供屏幕显示(OLED屏)和操作方式(旋钮和按键)。

    5 部分实现代码

    在这里插入图片描述
    部分核心代码:

    /**********************************************************
    简介:ADC1-CH6初始化函数
    ***********************************************************/															   
    void  Adc_Init(void)
    { 	
    	ADC_InitTypeDef ADC_InitStructure; 
    	GPIO_InitTypeDef GPIO_InitStructure;
    
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1, ENABLE );	  //使能ADC1通道时钟
     
    
    	RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
    
    	//PA6 作为模拟通道输入引脚                         
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;		//模拟输入
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOA, &GPIO_InitStructure);	
    
    	ADC_DeInit(ADC1);  //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值
    
    	ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;	//ADC工作模式:ADC1工作在独立模式
    	ADC_InitStructure.ADC_ScanConvMode = DISABLE;	//模数转换工作在单通道模式
    	ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;	//模数转换工作在非连续转换模式
    	ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2;	//转换由定时器2的通道2触发(只有在上升沿时可以触发)
    	ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;	//ADC数据右对齐
    	ADC_InitStructure.ADC_NbrOfChannel = 1;	//顺序进行规则转换的ADC通道的数目
    	ADC_Init(ADC1, &ADC_InitStructure);	//根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器   
    
    	ADC_Cmd(ADC1, ENABLE);	//使能指定的ADC1
    	
    	ADC_DMACmd(ADC1, ENABLE);	//ADC的DMA功能使能
    	
    	ADC_ResetCalibration(ADC1);	//使能复位校准  
    	 
    	ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 1, ADC_SampleTime_1Cycles5 );//ADC1通道6,采样时间为239.5周期	 
    	 
    	ADC_ResetCalibration(ADC1);//复位较准寄存器
    	 
    	while(ADC_GetResetCalibrationStatus(ADC1));	//等待复位校准结束
    	
    	ADC_StartCalibration(ADC1);	 //开启AD校准
     
    	while(ADC_GetCalibrationStatus(ADC1));	 //等待校准结束
     
    	ADC_SoftwareStartConvCmd(ADC1, ENABLE);		//使能指定的ADC1的软件转换启动功能
    
    }			
    
    /******************************************************************
    函数名称:TIM2_PWM_Init(u16 arr,u16 psc)
    函数功能:定时器3,PWM输出模式初始化函数
    参数说明:arr:重装载值
    		 psc:预分频值
    备    注:通过TIM2-CH2的PWM输出触发ADC采样
    *******************************************************************/ 	
    void TIM2_PWM_Init(u16 arr,u16 psc)
    {  
    	GPIO_InitTypeDef GPIO_InitStructure;
    	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    	TIM_OCInitTypeDef  TIM_OCInitStructure;
    	
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);	//使能定时器2时钟
     	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟
     
       //设置该引脚为复用输出功能,输出TIM2 CH2的PWM脉冲波形	GPIOA.1
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //TIM_CH2
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO
     
       //初始化TIM3
    	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 
    	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
    	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
    	
    	//初始化TIM2 Channel2 PWM模式	 
    	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
     	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
    	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高
    	TIM_OCInitStructure.TIM_Pulse=1000;	//发生反转时的计数器数值,用于改变占空比
    	TIM_OC2Init(TIM2, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM2
    
    	TIM_CtrlPWMOutputs(TIM2, ENABLE);//使能PWM输出
    	
    	TIM_Cmd(TIM2, ENABLE);  //使能TIM2
    }
    /******************************************************************
    函数名称:MYDMA1_Config()
    函数功能:DMA1初始化配置
    参数说明:DMA_CHx:DMA通道选择
    		 cpar:DMA外设ADC基地址
    		 cmar:DMA内存基地址
    		 cndtrDMA通道的DMA缓存的大小
    备    注:
    *******************************************************************/
    void MYDMA1_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
    {
    	DMA_InitTypeDef DMA_InitStructure;
    	NVIC_InitTypeDef NVIC_InitStructure;
    	
     	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);	//使能DMA传输
    	
        DMA_DeInit(DMA_CHx);   //将DMA的通道1寄存器重设为缺省值
    	DMA_InitStructure.DMA_PeripheralBaseAddr = cpar;  //DMA外设ADC基地址
    	DMA_InitStructure.DMA_MemoryBaseAddr = cmar;  //DMA内存基地址
    	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  //数据传输方向,从外设读取发送到内存//
    	DMA_InitStructure.DMA_BufferSize = cndtr;  //DMA通道的DMA缓存的大小
    	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //外设地址寄存器不变
    	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //内存地址寄存器递增
    	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;  //数据宽度为16位
    	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //数据宽度为16位
    	DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  //工作在循环模式
    	DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA通道 x拥有高优先级 
    	DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMA通道x没有设置为内存到内存传输
    	DMA_Init(DMA_CHx, &DMA_InitStructure);  //ADC1匹配DMA通道1
    	
    	DMA_ITConfig(DMA1_Channel1,DMA1_IT_TC1,ENABLE);	//使能DMA传输中断	
    	
    	//配置中断优先级
    	NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;		
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			
    	NVIC_Init(&NVIC_InitStructure);	
    
    	DMA_Cmd(DMA1_Channel1,ENABLE);//使能DMA通道
    }
    #define NPT 1024//一次完整采集的采样点数
    
    /******************************************************************
    函数名称:GetPowerMag()
    函数功能:计算各次谐波幅值
    参数说明:
    备  注:先将lBufOutArray分解成实部(X)和虚部(Y),然后计算幅值(sqrt(X*X+Y*Y)
    *******************************************************************/
    void GetPowerMag(void)
    {
        float X,Y,Mag,magmax;//实部,虚部,各频率幅值,最大幅值
        u16 i;
    	
    	//调用自cr4_fft_1024_stm32
    	cr4_fft_1024_stm32(fftout, fftin, NPT);	
    	//fftin为傅里叶输入序列数组,ffout为傅里叶输出序列数组
    	
        for(i=1; i<NPT/2; i++)
        {
    		X = (fftout[i] << 16) >> 16;
    		Y = (fftout[i] >> 16);
    		
    		Mag = sqrt(X * X + Y * Y); 
    		FFT_Mag[i]=Mag;//存入缓存,用于输出查验
    		//获取最大频率分量及其幅值
    		if(Mag > magmax)
    		{
    			magmax = Mag;
    			temp = i;
    		}
        }
    	F=(u16)(temp*(fre*1.0/NPT));//源代码中此公式有误,将此复制进去
    	
    	LCD_ShowNum(280,180,F,5,16);
    }					
    u16 magout[NPT];
    /******************************************************************
    函数名称:InitBufInArray()
    函数功能:正弦波值初始化,将正弦波各点的值存入magout[]数组中
    参数说明:
    备    注:
    *******************************************************************/
    void InitBufInArray(void)
    {
        u16 i;
        float fx;
        for(i=0; i<NPT; i++)
        {
            fx = sin((PI2*i)/NPT);
            magout[i] = (u16)(2048+2048*fx);
        }
    }
    
    /******************************************************************
    函数名称:sinout()
    函数功能:正弦波输出
    参数说明:
    备    注:将此函数置于定时器中断中,可模拟输出正弦波
    *******************************************************************/
    void sinout(void)
    {
    	static u16 i=0;
    	DAC_SetChannel1Data(DAC_Align_12b_R,magout[i]);
    	i++;
    	if(i>=NPT)
    		i=0;
    }
    void Dac2_Init(void)
    {
    	GPIO_InitTypeDef GPIO_InitStructure;
    	DAC_InitTypeDef DAC_InitType;
    
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );	  //使能PORTA通道时钟
       	RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE );	  //使能DAC通道时钟 
    
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;				 // 端口配置
     	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; 		 //模拟输入
     	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     	GPIO_Init(GPIOA, &GPIO_InitStructure);
    					
    	DAC_InitType.DAC_Trigger=DAC_Trigger_T4_TRGO;	//定时器4触发
    	DAC_InitType.DAC_WaveGeneration=DAC_WaveGeneration_Noise;//产生噪声
    	//DAC_WaveGeneration_Triangle产生三角波
    	DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude=DAC_TriangleAmplitude_4095;//幅值设置为最大,即3.3V
    	DAC_InitType.DAC_OutputBuffer=DAC_OutputBuffer_Disable ;	//DAC1输出缓存关闭 BOFF1=1
        DAC_Init(DAC_Channel_2,&DAC_InitType);	 //初始化DAC通道2
    
    	DAC_Cmd(DAC_Channel_2, ENABLE);  //使能DAC-CH2
    	
    	DAC_SetChannel1Data(DAC_Align_12b_R, 0);  //12位右对齐数据格式设置DAC值	
    }
    
    
    
    

    6 最后

    技术解答
    毕设帮助:<Q>746876041
    

    单片机毕设项目大全:
    https://blog.csdn.net/huawei123444/article/details/119822845

    展开全文
  • 利用protues8.9版本模拟窗帘自动闭合与开启,结合光敏传感器与步进电机实现,内含完整工程与仿真原理图,亲测有效。。
  • 基于单片机的病房呼叫系统设计毕业论文
  • 4、通过独立完成一个小的数字秒表系统设计,从硬件设计到软件设计,增强分析问题、解决问题的能力,为日后的毕业设计及科研工作奠定良好的基础。 5、掌握51单片机软件编程知识、实现功能、设计方法,及KEIL软件使用...
  • 小小的单片机实践项目,对于做毕设的可能有些帮助,如果需要其他资源请留言
  • 基于51单片机电子秤的毕业设计。附:原理图、文档、代码
  • 设计主要的内容是土壤湿度检测电路的设计与制作。该电路的工作原理是由AT89C51单片机和ADC0809组成系统的核心部分,湿度传感器将采集到的数据直接传送到ADC0809的IN端作为输入的模拟信号。选用湿度传感器和AD转换...
  • 基于单片机的智能家居系统设计毕业论文
  • 基于51单片机的电压表设计,ad读取电压,代码能够成功运行
  • 篮球比赛是根据运动队在规定的比赛时间里得分多少来决定胜负的,因此,篮球比赛的计时计分系统是一种得分类型的系统。篮球比赛的计时计分系由计时器,计分器等多种电子设备组成,同时,根据目前高水平篮球比赛要求,...
  • 毕业设计题目,仅供参考 毕业设计题目,仅供参考 毕业设计题目,仅供参考
  • 基于STM32单片机的智能宠物家居的设计与实现.pdf
  • 单片机毕业设计——基于单片机控制的交通灯毕业设计资料.zip
  • 单片机毕业设计基于三周加速度传感器的计步器设计 01 常用文件 10、设计报告 11、开题报告 1、Keil 工程 2、原理图 3.使用前必看 5、相关软件下载和教程 6、主要器件资料 7、制作详解 8、常见问题解答 毕设资料.zip
  • 基于STM32单片机的空气质量检测仪设计
  • 基于51单片机的医院输液系统毕业设计
  • 设计基于STM32单片机设计了太阳能电池板追日光跟踪系统,控制步进电机旋转跟踪太阳光,具有很高的灵敏度,另外有全套的课程资料。
  • 单片机毕业设计——基于51单片机的数字频率计设计论文资料.zip
  • 单片机毕业设计——基于51单片机的电子万年历的设计论文资料.zip
  • 内含数字温度计 单片机keil代码 和proteus电路原理仿真 以及设计论文 一条龙服务,超值~

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,696
精华内容 2,678
关键字:

基于32单片机毕业设计