找回密码
 注册

QQ登录

只需一步,快速开始

搜索

STM32数字示波器的设计(PCB+SCH文件)含仿真及源码

[复制链接]
coolice 发表于 2021-8-17 11:34:20 | 显示全部楼层 |阅读模式
本例程在 奋斗版STM32开发板V2,V2.1,V3,V5及MINI上调试通过           
演示的是3个蓝色LED(LED1-LED3) 轮流闪烁
    定义:   
    LED1-LED3 ---V6——V8
    V6----- PB5-LED1
    V7----- PD6-LED2(仅V2,V2.1 V3  V5板)
    V8----- PD3-LED3(仅V2,V2.1 V3  V5板)
下面是STM32 数字示波器的设计(pcb sch)含仿真,及源码
硬件设计.zip (2.65 MB, 售价: 2 E币)
源代码.zip (9.86 MB, 售价: 2 E币)
1.jpg
STM32 数字示波器的设计示波器AD板
1.png
示波器上层板
2.png
3.png
adc.c文件源码:
  1. /*---------------------------------------------------------
  2.                   ADC配置驱动程序
  3.         说明: 示波器AD采样配置,经过初步测试,AD采样速率为1.286M
  4.               正弦波最大不失真测量频率300kHz
  5.                   三角波最大不失真测量频率150kHz
  6.                   矩形波最大不失真测量频率100kHz
  7. ---------------------------------------------------------*/
  8. #include "stm32f10x.h"
  9. #include "adc.h"
  10. #include "oscilloscope.h"
  11. #include "ucos_ii.h"
  12. #include "tft_api.h"
  13. /*-----------------------------------------
  14.                             声明变量
  15. ------------------------------------------*/
  16. extern WaveType WaveInfo;
  17. extern WaveMode WaveCtrl;
  18. volatile u16 ADCConvertedValue[SAMPDEPTH];//AD转换缓冲区,占用RAM 0.8KB

  19. /*-----------------------------------------
  20.                             ADC1端口初始化
  21. ------------------------------------------*/
  22. void ADC1_GPIO_Init(void)
  23. {
  24.         GPIO_InitTypeDef IO_Init;
  25.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
  26.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC,ENABLE);
  27.         //C1模拟输入
  28.         IO_Init.GPIO_Pin = GPIO_Pin_1;
  29.         IO_Init.GPIO_Mode = GPIO_Mode_AIN;
  30.         GPIO_Init(GPIOC,&IO_Init);
  31. }

  32. /* #define ADC1_DR_Address ((unsigned int)0x40012400+0x4c) */
  33. /* unsigned short int ADC1_DMA_Value; */
  34. /*--------------------------------------------------
  35. 函数说明:配置ADC1完成AD采集,是本示波器最核心的部分.
  36. 配置方案:ADC1由TIM3提供的触发事件进行触发AD转换,控
  37.                   制TIM3的速率就可以完成采样率的改变.同时采
  38.                   用DMA完成数据传输,注入通道1完成内部温度传
  39.                   感器AD采集.
  40. --------------------------------------------------*/
  41. void ADC1_Mode_Config(void)
  42. {
  43.         //配置DMA
  44.         DMA_InitTypeDef DMA_csh;
  45.         ADC_InitTypeDef ADC_csh;
  46.         TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  47.         NVIC_InitTypeDef NVIC_InitStructure;

  48.         DMA_DeInit(DMA1_Channel1);                                             //DMA复位,通道1
  49.         DMA_csh.DMA_PeripheralBaseAddr = ADC1_DR_Address;  //ADC1地址
  50.         DMA_csh.DMA_MemoryBaseAddr = (unsigned int)ADCConvertedValue;  //内存地址
  51.         DMA_csh.DMA_DIR = DMA_DIR_PeripheralSRC;  
  52.         DMA_csh.DMA_BufferSize = SAMPDEPTH;                                            //缓冲大小为采样深度
  53.         DMA_csh.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //外设地址固定
  54.         DMA_csh.DMA_MemoryInc = DMA_MemoryInc_Enable;                         //内存地址自增
  55.         DMA_csh.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;  
  56.         DMA_csh.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  57.         DMA_csh.DMA_Mode = DMA_Mode_Circular;                                          //循环传输
  58.         DMA_csh.DMA_Priority = DMA_Priority_High;                                  //DMA优先级高
  59.         DMA_csh.DMA_M2M = DMA_M2M_Disable;
  60.         DMA_Init(DMA1_Channel1,&DMA_csh);                                                  //写入DMA1配置参数
  61.         DMA_Cmd(DMA1_Channel1,ENABLE);                                                           //使能DMA1通道1
  62.         DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE);                        //使能DMA CH1中断

  63.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  64.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
  65.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  66.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  67.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  68.         NVIC_Init(&NVIC_InitStructure);

  69.         //配置TIM3工作在18MHz,为AD提供触发
  70.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
  71.         TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  72.         TIM_TimeBaseStructure.TIM_Period = 1;         
  73.         TIM_TimeBaseStructure.TIM_Prescaler = 99;         //工作在18M,每格最大值时,不至于溢出      
  74.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;   
  75.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  76.         TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
  77.         TIM_SelectOutputTrigger(TIM3,TIM_TRGOSource_Update); //使用TIM3事件更新作为ADC触发
  78.       
  79.         //配置ADC
  80.         ADC_csh.ADC_Mode = ADC_Mode_Independent;                  //独立ADC模式
  81.     ADC_csh.ADC_ScanConvMode = DISABLE;                           //关闭扫描模式
  82.         ADC_csh.ADC_ContinuousConvMode = DISABLE;                  //连续AD转换开启
  83.         ADC_csh.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T3_TRGO;  //由TIM3提供的触发事件进行触发AD转换
  84.         ADC_csh.ADC_DataAlign = ADC_DataAlign_Right;         //数据右对齐
  85.         ADC_csh.ADC_NbrOfChannel = 1;                                          //要转换的通道数目1
  86.         ADC_Init(ADC1,&ADC_csh);                                                   //写入ADC1配置参数
  87.         ADC_RegularChannelConfig(ADC1,ADC_Channel_11,1,ADC_SampleTime_1Cycles5);//采样速率1M
  88.         ADC_DMACmd(ADC1,ENABLE);                                                 //使能ADC1 DMA
  89.         ADC_ExternalTrigConvCmd(ADC1,ENABLE);                        //打开ADC1外部触发
  90.       
  91.         ADC_InjectedChannelConfig(ADC1,ADC_Channel_16,1,ADC_SampleTime_239Cycles5);         //配置ADC1通道16为注入通道1
  92.         ADC_ExternalTrigInjectedConvConfig(ADC1,ADC_ExternalTrigInjecConv_None);         //软件触发注入通道的转换
  93.         ADC_TempSensorVrefintCmd(ENABLE);                                                                                         //使能温度传感器

  94.         ADC_Cmd(ADC1,ENABLE);                                                         //使能ADC1
  95.         ADC_ResetCalibration(ADC1);                                                  //复位校准寄存器
  96.         while(ADC_GetResetCalibrationStatus(ADC1));     //等待校准寄存器复位完成
  97.         ADC_StartCalibration(ADC1);                                                  //开始校准
  98.         while(ADC_GetCalibrationStatus(ADC1));                         //等待校准完成
  99.         TIM_Cmd(TIM3,ENABLE);
  100. }
  101. /*-----------------------------------------
  102. 函数说明:通过注入通道1转换内部温度传感器
  103.                   AD值,读取10次有效数据取平均返回
  104. ------------------------------------------*/
  105. u16 GetTempSensor(void)   
  106. {
  107.         u16 temp=0,i,k=0;
  108.         for(i=0; i<10; )
  109.         {
  110.                 ADC_SoftwareStartInjectedConvCmd(ADC1,ENABLE);        //软件触发注入通道的转换
  111.                 k = (0x6EE - ADC_GetInjectedConversionValue(ADC1,ADC_InjectedChannel_1)) / 0x05 + 25;
  112.                 if(k>0 && k<100)
  113.                 {
  114.                         temp += k;
  115.                         i++;
  116.                 }
  117.         }
  118.         temp /= 10;
  119.         return temp;            
  120. }
  121. /*-----------------------------------------
  122. 函数说明:ADC1初始化
  123. ------------------------------------------*/
  124. void ADC1_Init(void)
  125. {
  126.         ADC1_GPIO_Init();
  127.         ADC1_Mode_Config();
  128. }
  129. /*-----------------------------------------
  130. 函数说明:ADC传输DMA通道1中断服务程序
  131.                   DMA把AD值传输到缓冲区完成后关闭定
  132.                   时器3(作为触发AD转换的定时器)同时
  133.                   置更新完成标志位为1,开定时器3在应
  134.                   用中开启.
  135. ------------------------------------------*/
  136. void DMA1_Channel1_IRQHandler()
  137. {
  138.       OSIntNesting++;  
  139.       DMA_ClearFlag(DMA1_FLAG_TC1);        //清除DMA传输完成中断
  140.       TIM_Cmd(TIM3,DISABLE);                //关闭TIM3
  141.       WaveCtrl.UpdatTrue = 1;                //已经完成一次波形FIFO,可以批量读出数据
  142.       OSIntExit();
  143. }
  144. /*-----------------------------------------
  145. 函数说明:擦除AD缓冲区
  146. ------------------------------------------*/
  147. void Earse_AD_FIFO(void)
  148. {
  149.         uint32_t i;
  150.         for(i=0; i<SAMPDEPTH; i++)
  151.         {
  152.                 ADCConvertedValue[i] = 0;
  153.         }      
  154. }
复制代码

主程序:
  1. /*------------------------------------------------------------------------------------
  2.                                                                    STM32示波器
  3. 硬件平台:
  4.                         主控器: STM32F103ZET6 64K RAM 512K ROM
  5.                         屏幕器: SSD1963
  6.                         分辨率: 480x272 16位色
  7.                    触摸屏: TSC2046
  8.                         模拟电路: OP  - TL084
  9.                                           OP  - u741
  10.                                           SW  - CD4051
  11.                                           CMP - LM311
  12.                                           PWR - LM7805
  13.                                               - LM7905
  14.                                                   - MC34063
  15.                                                   - AMS1117-3.3
  16.                                           DRI - ULN2003
  17.                         继电器:信号继电器
  18.                     电源:   DC +12V

  19. 软件平台:
  20.                         开发环境: RealView MDK-ARM uVision4.10
  21.                         C编译器 : ARMCC
  22.                         ASM编译器:ARMASM
  23.                         连接器:   ARMLINK
  24.                         实时内核: uC/OS-II 2.90实时操作系统
  25.                         GUI内核 : uC/GUI   3.90图形用户接口
  26.                         底层驱动: 各个外设驱动程序
  27.       
  28.         ROM Size = Code + RO-data +RW-data
  29.         RAM Size = RW-data + ZI-data
  30.         Program Size: Code=56024 RO-data=8272 RW-data=256 ZI-data=29912         
  31. 版本: V1.0 - 2013/11/9
  32.        V1.1 - 2014/2/8
  33.            V3.0 - 2014/2/19                              
  34. -------------------------------------------------------------------------------------*/   
  35. #include "stm32f10x.h"
  36. #include "ucos_ii.h"
  37. #include "app.h"
  38. #include "GUI.h"

  39. #include "usart1.h"
  40. #include "pincfg.h"
  41. #include "delay.h"
  42. #include "tft_api.h"
  43. #include "dac.h"
  44. #include "adc.h"
  45. #include "iwdg.h"
  46. #include "timer.h"
  47. #include "EXTI.H"
  48. #include "oscilloscope.h"
  49. #include "indkey.h"
  50. #include "tsc2046.h"

  51. #include "task_rtc.h"
  52. #include "task_gui.h"
  53. #include "task_sd.h"


  54. /*-----------------------------------------
  55.                                 声明起始任务栈
  56. ------------------------------------------*/
  57. OS_STK  Task_Start_Stk[TASK_START_STK_SIZE];

  58. /*-----------------------------------------
  59. 因为涉及到对共享资源的访问,创建互斥信号量
  60. ------------------------------------------*/
  61. OS_EVENT *LCD_Buffer_MUTEX;
  62. OS_EVENT *USART_Buffer_MUTEX;
  63. OS_EVENT *SDtoRAM_Buffer_MUTEX;
  64. /*-----------------------------------------
  65.                                 主 函 数
  66. ------------------------------------------*/   
  67. int main(void)   
  68. {   
  69.          INT8U err;
  70.      SystemInit();                 //初始化RCC时钟
  71.          OSInit();
  72.                            
  73.          LCD_Buffer_MUTEX     = OSMutexCreate(4,&err);        //创建3个共享资源互斥信号量
  74.          USART_Buffer_MUTEX   = OSMutexCreate(4,&err);
  75.          SDtoRAM_Buffer_MUTEX = OSMutexCreate(4,&err);
  76.             
  77.      OSTaskCreate(Task_Start,(void *)0,&Task_Start_Stk[TASK_START_STK_SIZE-1],TASK_START_PRIO); //起始任务   
  78.          
  79.          OSStart();      
  80. }
  81. /*-------------------------------------------------------------------------------
  82. 函数功能:初始化各种外设
  83. 说    明:因为跑操作系统,所以外设的初始化应该放在操作系统的初始任务中完成,不能
  84.           在while(1)循环外部完成外设的初始化工作,否则操作系统可能无法启动.
  85.                   本函数在app.c中被调用
  86. -------------------------------------------------------------------------------*/
  87. void BSP_Init(void)
  88. {
  89.         OS_CPU_SR  cpu_sr = 0u;
  90.         OS_ENTER_CRITICAL();
  91.         DelayInit();                 //初始化延时
  92.         PinCfg();                         //外部器件控制配置
  93.         FSMC_LCD_Init();         //FSMC总线配置                  
  94.         GUI_Init();                         //初始化UCGUI界面
  95.         TSC2046_Config();         //初始化触摸控制器
  96.         USART1_Config();         //初始化串口
  97.         DAC_Config();                 //初始化DAC1
  98.         ADC1_Init();                 //初始化ADC1
  99.         EXTI_Config();                 //初始化外部中断
  100.         Key_EXTI_Config();         //初始化按键中断
  101.         TIM5_Config(1999,71);  //TIM5以1MHz频率计数,每2ms溢出中断
  102. //        TIM4_Config(59999,71); //TIM4以1MHz频率计数,每60ms溢出中断
  103.         RTC_Init();                            //初始化RTC
  104. //        SD_Init();
  105.         JDQ_ACDC = 1;                  //交流耦合
  106.         ManualGainScan(3);    //调试用
  107.         IWDG_Init(4,625);     //喂狗时间为1000ms
  108.         OS_EXIT_CRITICAL();         
  109. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-4-26 19:01

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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