找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1554|回复: 1
打印 上一主题 下一主题
收起左侧

STM32的示波器开发程序

[复制链接]
跳转到指定楼层
楼主
ID:492572 发表于 2019-3-21 16:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今年在做单片机项目,是一个基于labview的虚拟示波器,程序全部开源 可供大家下载

所有资料51hei提供下载:
数字存储示波器.7z (1.25 MB, 下载次数: 24)

单片机源程序如下:
  1. #include "stm32f10x.h"          
  2. #include <stdio.h>
  3. #include "usart.h"
  4. #include "touch_panel.h"
  5. #include "systick.h"
  6. #include "tft_lcd.h"
  7. #include "back_light.h"
  8. #include "oscilloscope.h"
  9. #include "button.h"
  10. #include "wave_maker.h"

  11. /*******************************************************************************
  12.         函数名:main
  13.         输  入:        void
  14.         输  出:        int
  15.         功  能:用户程序入口
  16. ********************************************************************************/
  17. int main(void)
  18. {                                                                                  
  19.         SystemInit();                                                   //系统初始化
  20.         TP_Configuration();                                           //触摸屏初始化
  21.         USART_Configuration();                                   //串口初始化
  22.         ButtonInit();                                                   //按键初始化
  23.         SysTick_Config(SystemFrequency / 1000);//滴答时钟配置,1MS进入中断一次


  24.         OscilloscopeMain();       
  25. }



  26. #ifdef  USE_FULL_ASSERT

  27. /**
  28.   * @brief  Reports the name of the source file and the source line number
  29.   *   where the assert_param error has occurred.
  30.   * @param  file: pointer to the source file name
  31.   * @param  line: assert_param error line source number
  32.   * @retval None
  33.   */
  34. void assert_failed(uint8_t* file, uint32_t line)
  35. {
  36.   /* User can add his own implementation to report the file name and line number,
  37.      ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  38.   /* Infinite loop */
  39.   while (1)
  40.   {
  41.   }
  42. }
  43. #endif

  44. /**
  45.   * @}
  46.   */

  47. /**
  48.   * @}
  49.   */

  50. /******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/
复制代码

  1. #include "stm32f10x.h"
  2. #include <stdio.h>
  3. #include "systick.h"
  4. #include "wave_maker.h"

  5. //波形由PA4输出, PA4 用作 DAC_OUT1, DAC的参考电压 = 3.3V
  6. //正弦波
  7. const uint16_t g_Sine32[32] =
  8. {
  9. 2047, 2447, 2831, 3185, 3498, 3750, 3939, 4056, 4095, 4056,
  10. 3939, 3750, 3495, 3185, 2831, 2447, 2047, 1647, 1263, 909,
  11. 599, 344, 155, 38, 0, 38, 155, 344, 599, 909, 1263, 1647
  12. };
  13. //方波
  14. const uint16_t g_Square32[32] =
  15. {
  16. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  17. 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095,
  18. 4095, 4095, 4095, 4095, 4095, 4095, 4095, 4095
  19. };
  20. uint16_t g_Wave[32];

  21. /*******************************************************************************
  22.         函数名:WaveMakerInit
  23.         输  入:void
  24.         输  出:void
  25.         功  能:初始化波形发生器。
  26.                         配置PA4 为DAC_OUT1, 启用DMA2
  27. *******************************************************************************/
  28. void WaveMakerInit(void)
  29. {

  30.         uint32_t i;

  31.         for (i = 0; i < 32; i++)
  32.         {
  33.                 g_Wave[i] = g_Sine32[i] * 0.606;  //调整正弦波幅度
  34.         }

  35.         {
  36.                 //配置时钟
  37.                 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);       
  38.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  39.                 RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
  40.                 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
  41.         }
  42.         {       
  43.                 //配置GPIO
  44.                 GPIO_InitTypeDef GPIO_InitStructure;
  45.                 GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4;           //配置PA4为DAC_OUT1
  46.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  47.                 GPIO_Init(GPIOA, &GPIO_InitStructure);
  48.          }
  49.        
  50. #if 1
  51.         {
  52.                 //配置TIM6
  53.                 TIM_PrescalerConfig(TIM6, 0, TIM_PSCReloadMode_Update);
  54.                 //决定DAC输出的采样频率 , x = 72000000 / 频率
  55.                 //TIM_SetAutoreload(TIM6, 562);           //562 输出1KHz的正弦波
  56.                 //TIM_SetAutoreload(TIM6, 22);           //22 输出100KHz的正弦波
  57.                 TIM_SetAutoreload(TIM6, 220);           //22 输出10KHz的正弦波
  58.                 TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update); //更新事件被用作触发输出
  59.         }
  60. #else
  61.         {
  62.                 //配置TIME2
  63.                 TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;
  64.                  
  65.                 TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  66.                 TIM_TimeBaseStructure.TIM_Period = 0x19;         
  67.                 TIM_TimeBaseStructure.TIM_Prescaler = 0x0;      
  68.                 TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;   
  69.                 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  70.                 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  71.                
  72.                 TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);//更新事件被用作输出触发          
  73.         }
  74. #endif

  75.         {
  76.                 //配置DAC_1
  77.                 DAC_InitTypeDef DAC_InitStructure;

  78.                 DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO;
  79.                 //DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO;
  80.                 DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
  81.                 DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
  82.                 DAC_Init(DAC_Channel_1, &DAC_InitStructure);
  83.         }
  84.        
  85.         for (i = 0; i < 32; i++)
  86.         {
  87.                 g_Wave[i] = g_Sine32[i] * 0.606;//调整正弦波幅度
  88.         }
  89.        
  90.         {
  91.                 //配置DMA2_3
  92.                 DMA_InitTypeDef DMA_InitStructure;
  93.        
  94.                 DMA_DeInit(DMA2_Channel3);
  95.                 DMA_InitStructure.DMA_PeripheralBaseAddr = DAC_DHR12R1_Address;
  96.                 DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&g_Wave;
  97.                 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
  98.                 DMA_InitStructure.DMA_BufferSize = 32;
  99.                 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  100.                 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  101.                 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  102.                 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  103.                 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  104.                 DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  105.                 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  106.                 DMA_Init(DMA2_Channel3, &DMA_InitStructure);

  107.                 DMA_Cmd(DMA2_Channel3, ENABLE);
  108.         }

  109.         DAC_Cmd(DAC_Channel_1, ENABLE);
  110.         DAC_DMACmd(DAC_Channel_1, ENABLE);
  111.         TIM_Cmd(TIM6, ENABLE);
  112.         //TIM_Cmd(TIM2, ENABLE);
  113. }

  114. /************************************************************************
  115.         函数名:SetWaveType
  116.         输  入:波形
  117.         输  出:void
  118.         功  能:设置输出的波形
  119. ************************************************************************/
  120. void SetWaveType(uint8_t _type)
  121. {
  122.         /*
  123.                 计算波形幅度。
  124.                 DAC寄存器最大值 4096 对应3.3V

  125.                 我们期望获得2V的幅度,系数 = 0.606
  126.                 4096 * 0.606 = 2482
  127.         */
  128.         TIM_Cmd(TIM6, DISABLE);
  129.         switch(_type)
  130.         {
  131.                 case SINE:            //正弦波
  132.                         {
  133.                                 uint32_t i;
  134.                                 for (i = 0; i < 32; i++)
  135.                                 {
  136.                                         g_Wave[i] = g_Sine32[i] * 0.606;//调整正弦波幅度
  137.                                 }

  138.                         }
  139.                         break;

  140.                 case SQUARE:        //方波
  141.                         {
  142.                                 uint32_t i;

  143.                                 for (i = 0; i < 32; i++)
  144.                                 {
  145.                                         g_Wave[i] = g_Square32[i] * 0.606;
  146.                                 }

  147.                         }
  148.                         break;
  149.         }
  150.     TIM_Cmd(TIM6, ENABLE);
  151. }
复制代码




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:328014 发表于 2019-3-22 01:02 | 只看该作者
压缩包里面只有程序 没有原理图?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表