久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1206|回復: 3
打印 上一主題 下一主題
收起左側

STM32F103C8T6簡易示波器程序

[復制鏈接]
跳轉到指定樓層
樓主
電壓0-3.3V


  1. #include "stm32f10x.h"                  // Device header
  2. #include "Delay.h"
  3. #include "OLED.h"
  4. #include <math.h>
  5. #include <stdio.h>
  6. #include "ad.h"

  7. #define OLED_WIDTH 128
  8. #define OLED_HEIGHT 64
  9. #define WAVE_SAMPLES 64 // 波形采樣點數
  10. #define WAVE_OFFSET 17 // 波形在Y軸上的偏移量
  11. #define VOLTAGE_RANGE 3.3 // 電壓范圍
  12. #define VOLTAGE_STEP 0.1  // 電壓步長
  13. #define VOLTAGE_TO_PIXEL_SCALE 14 // 電壓到像素的縮放比例

  14. int16_t wave_buffer[WAVE_SAMPLES]; // 波形緩沖區
  15. uint16_t wave_index = 0; // 波形緩沖區索引

  16. int16_t x,y;
  17. double radian;
  18. double voltage; //電壓值
  19. double phase_angle; // 相位角,范圍是0到2π

  20. double voltage_increment = VOLTAGE_STEP; // 電壓增量
  21. double sample_rate = (double)OLED_WIDTH / WAVE_SAMPLES; // 采樣率

  22. uint16_t ADValue;

  23. #define NUM_PERIODS 10 // 要計算平均頻率的周期數
  24. double period_times[NUM_PERIODS]; // 存儲周期時間間隔的數組
  25. int period_index = 0; // 當前周期時間間隔的索引

  26. void PWM_Init(void);
  27. void Servo_SetAngle(float Angle);
  28. void PWM_SetCompare2(uint16_t Compare);
  29. void Timer3_init(uint16_t arr,uint16_t psc);

  30. void OLED_DrawWave()
  31. {
  32.         int16_t x_current;
  33.         int16_t y_current;
  34.         int16_t x_end = 0; // 波形結束X坐標(屏幕最左側)
  35.         int16_t y_prev = WAVE_OFFSET; // 上一個點的Y坐標
  36.    
  37.     // 繪制波形線
  38.     for (int i = 0; i < WAVE_SAMPLES; i++)
  39.     {
  40.          x_current= (OLED_WIDTH - 1) - (i * (OLED_WIDTH - 1) / (WAVE_SAMPLES - 1))/1; // 當前點的X坐標
  41.          y_current= wave_buffer[(wave_index + i) % WAVE_SAMPLES]; // 當前點的Y坐標(循環緩沖區)
  42.         
  43.         // 如果當前點不是第一個點,則繪制線段
  44.         if (i > 0)
  45.         {
  46.            OLED_DrawLine(x_end, y_prev, x_current, y_current);
  47.         }
  48.         
  49.         x_end = x_current; // 更新結束X坐標
  50.         y_prev = y_current; // 更新上一個點的Y坐標
  51.     }
  52.                
  53. }

  54. void TIM3_IRQHandler(void)
  55. {
  56.   if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
  57.         {
  58.                 TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
  59.         }
  60. }


  61. int main(void)
  62. {
  63.         uint8_t i;
  64.         double frequency_sum = 0.0;
  65.   OLED_Init();
  66.         AD_Config();
  67.         PWM_Init();
  68.         Timer3_init(10000,7200);
  69.         while(1)
  70.         {
  71.                 i++;
  72.                 PWM_SetCompare2(i);
  73.                 ADValue = AD_GetValue();
  74.     voltage = (float)ADValue / 4095 * VOLTAGE_RANGE;
  75.                 OLED_ClearArea(0, 0, OLED_WIDTH, OLED_HEIGHT);
  76.                 OLED_ShowFloatNum(70,0,voltage,2,2,OLED_6X8);

  77. //                OLED_ShowFloatNum(0,0,average_frequency,2,5,OLED_6X8);
  78.                
  79.                
  80.                 // 將新的電壓值添加到波形緩沖區,并更新索引
  81.                 wave_buffer[wave_index] = (int16_t)(voltage * VOLTAGE_TO_PIXEL_SCALE + WAVE_OFFSET);
  82.                 wave_index = (wave_index +1) % WAVE_SAMPLES; // 循環緩沖區
  83.                 OLED_DrawWave(); // 繪制波形
  84.                
  85.                 OLED_Update(); // 將數據更新到OLED
  86.         }
  87. }


  88. //int main(void)
  89. //{
  90. //        OLED_Init();
  91. //        AD_Config();
  92. //        PWM_Init();
  93. //        while (1)
  94. //        {
  95. //                OLED_ClearArea(0,0,128,64);       
  96. ////                // 將電壓值線性映射到相位角上
  97. ////    phase_angle = voltage * (2 * 3.14 / 3.3); // 3.3是電壓范圍的最大值
  98. ////                for(x=0;x<128;x++)
  99. ////                {
  100. ////                  radian=(double)x*(2*3.14/128)+phase_angle;
  101. ////                        y=(int16_t)(voltage*10*sin(radian)+32);
  102. ////                         OLED_DrawPoint(x, y);
  103. ////                        // 確保y坐標在OLED屏幕范圍內
  104. ////        if (y < 0) y = 0;
  105. ////        if (y >= 64) y = 64 - 1;
  106. ////                }
  107. ////                voltage+=0.1;
  108. ////                if(voltage>3.3)
  109. ////                {
  110. ////                  voltage-=0.1;
  111. ////                }
  112. ////                if (phase_angle >= 2 * 3.14) {
  113. ////            phase_angle -= 2 * 3.14; }
  114. //                               
  115. //                OLED_ShowFloatNum(20,0,voltage,1,2,OLED_8X16);
  116. //               
  117. //                ADValue = AD_GetValue();
  118. //                voltage = (float)ADValue / 4095 * 3.3;
  119. //                // 根據voltage值計算波形數據點
  120. //                for (int i = 0; i < WAVE_SAMPLES; i++)
  121. //                {
  122. //                                double position = (double)i / (WAVE_SAMPLES - 1); // 當前位置(0到1之間)
  123. //                                double normalized_voltage = voltage / VOLTAGE_RANGE; // 歸一化電壓值
  124. //                                double wave_height = (sin(12 * 3.14 * position) + 1) / 2 * normalized_voltage * (OLED_HEIGHT - 2 * WAVE_OFFSET); // 計算波形高度
  125. //                                wave_buffer[i] = (int16_t)(WAVE_OFFSET + wave_height+10); // 轉換為整數并加上偏移量
  126. //                }
  127. //        // 繪制波形到OLED屏幕
  128. //                for (int i = 0; i < WAVE_SAMPLES - 1; i++)
  129. //                {
  130. //                                OLED_DrawLine(i * sample_rate, wave_buffer[i], (i + 1) * sample_rate, wave_buffer[i + 1]);
  131. //                }
  132. ////                // 更新voltage值
  133. ////                voltage += voltage_increment;
  134. ////                if (voltage > VOLTAGE_RANGE)
  135. ////                {
  136. ////                                voltage = VOLTAGE_RANGE;
  137. ////                                voltage_increment = -VOLTAGE_STEP; // 開始減小voltage值
  138. ////                }
  139. ////                else if (voltage < 0.0)
  140. ////                {
  141. ////                                voltage = 0.0;
  142. ////                                voltage_increment = VOLTAGE_STEP; // 開始增大voltage值
  143. ////                }
  144. //                OLED_Update();//將數據更新到oled
  145. //                Delay_ms(500);
  146. //        }
  147. //}


  148. void PWM_Init(void)
  149. {
  150.        
  151.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  152.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  153.        
  154.         GPIO_InitTypeDef GPIO_InitStructure;
  155.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  156.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  157.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  158.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  159.        
  160.         TIM_InternalClockConfig(TIM2);
  161.        
  162.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  163.         TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  164.         TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
  165.         TIM_TimeBaseInitStructure.TIM_Period = 4000-1;                //ARR
  166.         TIM_TimeBaseInitStructure.TIM_Prescaler = 72-1;                //PSC
  167.         TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
  168.         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
  169.        
  170.         TIM_OCInitTypeDef TIM_OCInitStructure;
  171.         TIM_OCStructInit(&TIM_OCInitStructure);
  172.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  173.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  174.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  175.         TIM_OCInitStructure.TIM_Pulse = 1;                //CCR
  176.         TIM_OC2Init(TIM2, &TIM_OCInitStructure);
  177.        
  178.         TIM_CtrlPWMOutputs(TIM2, ENABLE);         //使能PWM波對外設的輸出
  179.         TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_OC2Ref);//選擇TIM2上升沿作為ADC觸發源
  180.         TIM_Cmd(TIM2, ENABLE);
  181.        
  182. }

  183. void Timer3_init(uint16_t arr,uint16_t psc)
  184. {
  185.          TIM_TimeBaseInitTypeDef TIM3_TimeBaseInitStruct={0};
  186.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
  187.        
  188.          //TIM_ETRClockMode2Config(TIM2,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0x00);//使用外部時鐘,關閉外部觸發TIM預分頻器,上升沿激活,關閉外部觸發過濾器
  189.         TIM_InternalClockConfig(TIM3);//使用內部時鐘
  190.          
  191.          //f=72000/10000/7200=0.001
  192.          TIM3_TimeBaseInitStruct.TIM_ClockDivision           = TIM_CKD_DIV1 ;//時鐘分頻1
  193.          TIM3_TimeBaseInitStruct.TIM_CounterMode             = TIM_CounterMode_Up ;//向上計數
  194.          TIM3_TimeBaseInitStruct.TIM_Period                                                =  arr;//負載重裝值
  195.          TIM3_TimeBaseInitStruct.TIM_Prescaler                                = psc ;//預分頻值
  196.          TIM3_TimeBaseInitStruct.TIM_RepetitionCounter= 0 ;//關閉重復計數(高級定時器才有)
  197.         TIM_TimeBaseInit(TIM3,&TIM3_TimeBaseInitStruct);
  198.          
  199.          TIM_ClearFlag(TIM3,TIM_FLAG_Update);//清除更新中斷標志位,避免初始化完就進入中斷
  200.          
  201.          TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//使能中斷
  202.          
  203.          NVIC_InitTypeDef NVIC_TIM3_InitStruct={0};
  204.          NVIC_TIM3_InitStruct.NVIC_IRQChannel                     = TIM3_IRQn ;//中斷通道
  205.          NVIC_TIM3_InitStruct.NVIC_IRQChannelCmd                  = ENABLE ;
  206.          NVIC_TIM3_InitStruct.NVIC_IRQChannelPreemptionPriority   = 2 ;//搶占優先級
  207.          NVIC_TIM3_InitStruct.NVIC_IRQChannelSubPriority          = 2 ;//響應優先級
  208.         NVIC_Init(&NVIC_TIM3_InitStruct);
  209.          
  210.           TIM_Cmd(TIM3,ENABLE);
  211. }

  212. void PWM_SetCompare2(uint16_t Compare)
  213. {
  214.         TIM_SetCompare2(TIM2, Compare);
  215. }

  216. void Servo_SetAngle(float Angle)
  217. {
  218.         PWM_SetCompare2(Angle / 180 * 2000 + 500);
  219. }

復制代碼

原理圖: 無
仿真: 無
代碼: 32簡易示波.7z (189.13 KB, 下載次數: 0)

評分

參與人數 1黑幣 +30 收起 理由
wpppmlah + 30 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1067504 發表于 2025-1-3 21:39 來自手機 | 只看該作者
看著很厲害的樣子,有沒有原理圖?
回復

使用道具 舉報

板凳
ID:337139 發表于 2025-1-4 08:59 | 只看該作者
大將之才,可以完善一下的。
回復

使用道具 舉報

地板
ID:601214 發表于 2025-1-20 11:46 | 只看該作者
STM32F103C6T6能用嗎?沒原理圖?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲视频自拍 | 中文字字幕一区二区三区四区五区 | 宅男伊人 | 日本三级电影免费 | 久草青青草 | 久久免费精品视频 | 亚洲一区亚洲二区 | 懂色av蜜桃av | 成人中文网| 性一爱一乱一交一视频 | 国产黄色在线观看 | 亚洲精品久久久久久宅男 | 亚洲国产成人精品女人久久久野战 | 国产亚洲精品久久久久久牛牛 | 久久久久久高潮国产精品视 | 成人在线视频网 | 久久99深爱久久99精品 | 日日操操操 | 久久久久久久国产精品影院 | 福利片在线观看 | 午夜成人免费视频 | 久日精品 | 狠狠操网站 | 中文字幕国产 | 国产成人免费视频网站视频社区 | 久久伊人精品 | 国产高清视频一区二区 | 亚洲永久入口 | 欧美高清一区 | 91国产在线视频在线 | 国产成人一区二区三区久久久 | 精品国产精品三级精品av网址 | 精品免费 | 国产免费自拍 | 日韩在线视频一区二区三区 | 黄色免费av| 做a视频| 国产在线精品一区二区 | 国产精品久久久久久久久久妇女 | 在线日韩视频 | 91色视频在线观看 |