红叶何时落水

校赛第二部分

详见

http://t.csdn.cn/50yJu

利用定时器的输入捕获模式来测量相位差

通过 (两路波形上升沿的时间差 / 波形周期)* 360°来实现相位差的测量

deg = (360 - (((TIM2CH1_CAPTURE_VAL3 * 360)  / (TIM2CH1_CAPTURE_VAL)) + chart)) % 180;

其中chart为线性补偿,可以通过按键改变其值,以此实现不同电路的测量

可以利用相位差来计算相应的频率与峰峰值

难点在于C语言中int 类型 (2 / 3)* 3 = 0;

解决,((2 * 10 / 3) * 3) / 10 = 1;尽量吧

vpp = (((((deg * 1000000)/56 - 285714) / 33) * 4096)/ 88) / 100000 ;
tim4 = 1000000 / (35 * deg - 600);     

再一个功能,第二个单片机需要实现扫描功能,而第三个需要检测它。

那么我们如何保证输出与检测同时进行呢?

方案一

难点,需要极快的手速,两个单片机的按键同时按下。

结局方案,多多练习手速

方案二

因为两个单片机只允许用一根线连接,所以我们只能用电压作为启动信号。

将第二个单片机的前五秒输出设置为3.3V输出,之后再扫描。

而第三个单片机再检测到小于3.3V的电压后,在进行数据的采集。

不足,由于启动信号为直流,所以在经过放大与衰减电路后会失真,导致启动信号失效。

解决,将启动信号改成峰峰值为3.3V的正弦波,后续电路检测峰峰值是否小于3.3V

主函数

int main(void){ u16 adcx;int i = 0, t = 0;Init();while(1){ deg = (360 - (((TIM2CH1_CAPTURE_VAL3 * 360)  / (TIM2CH1_CAPTURE_VAL)) + chart)) % 180;delay_ms(50);change();t=KEY_Scan(0);       //µÃµ½¼üÖµswitch(t){                 case KEY0_PRES:pint_deg = (pint_deg + 1) % 5;LCD_ShowxNum(120,50, pint_deg,3,16,0X80);break;case KEY1_PRES:deg2 = deg2 + 10;if(pint_deg == 3) {chart++;}break;case WKUP_PRES:      deg2 = deg2 - 10;if(pint_deg == 3) {chart--;}break;default:delay_ms(10);} }
}   void Init(void) {uart_init(9600);delay_init();LCD_Init();KEY_Init();        TIM5_Int_Init(0XFFFF,0);TIM3_Int_Init(0XFFFF,0);    Dac3_Init();MYDMA1_Config( (u32) & (DAC->DHR12R1), (u32)SIN, 72);TIM2_Config(tim4, 1);POINT_COLOR=BLUE; LCD_ShowString(80,50,50,16,16,"deg");LCD_ShowString(80,70,50,16,16,"deg2");LCD_ShowxNum(120,50, pint_deg,3,16,0X80);
}void change(void) {int n = 0;if(pint_deg == 0) {if(old_deg != deg) {old_deg = deg;vpp = (((((deg * 1000000)/56 - 285714) / 33) * 4096)/ 88) / 100000 ;tim4 = 1000000 / (35 * deg - 600);            LCD_ShowxNum(50,50, deg,3,16,0X80);for(i = 0; i < 72; i++) {SIN[i] = old_SIN[i] * vpp;}          TIM2->ARR = tim4;delay_ms(500);}} else if(pint_deg == 1) {if(old_deg2 != deg2) {old_deg2 = deg2;vpp = (((((deg2 * 1000000)/56 - 285714) / 33) * 4096)/ 88) / 100000 ;tim4 = 1000000 / (35 * deg2 - 600);          LCD_ShowxNum(50,70, deg2,3,16,0X80);LCD_ShowString(80,100,200,16,16,"V = 1/28P - 4/7        ");LCD_ShowString(80,120,200,16,16,"F = 35P - 600");for(i = 0; i < 72; i++) {SIN[i] = old_SIN[i] * vpp;}           TIM2->ARR = tim4;delay_ms(50);}} else if(pint_deg == 4) {for(i = 0; i < 72; i++) {SIN[i] = 4000;}      delay_ms(10000);for(i = 0; i < 70; i++) {tim4 = 1000000 / (35 * (20 + 2 * i) - 600);    vpp = ((((((20 + 2 * i) * 1000000)/56 - 285714) / 33) * 4096)/ 88) / 100000 ; LCD_ShowxNum(50,70, (20 + 2 * i),3,16,0X80);for(n = 0; n < 72; n++) {SIN[n] = old_SIN[n] * vpp;}        TIM2->ARR = tim4;delay_ms(20);}pint_deg = 0;LCD_ShowxNum(120,50, pint_deg,3,16,0X80);} else if(pint_deg == 2) {if(old_deg2 != deg2) {old_deg2 = deg2;tim4 = 1000000 / (35 * deg2 - 600);  vpp = ((((((35 * deg2 - 600) * 100000 / 2000)) / 33) * 4096)/ 88) / 10000 ;LCD_ShowString(80,100,200,16,16,"V = F / 2000             ");LCD_ShowString(80,120,200,16,16,"                      ");LCD_ShowxNum(50,70, deg2,3,16,0X80);for(i = 0; i < 72; i++) {SIN[i] = old_SIN[i] * vpp;}         TIM2->ARR = tim4;delay_ms(50);}}
}

stm32 检测相位差 并简单实现两个单片机的通信相关推荐

  1. 两个hc05蓝牙模块在两块单片机上通信(附完整代码)

    目录 第一步:进入AT模式 第二步:同时插在电脑上实现通信 第三步:单片机上通信 代码链接 所需材料:两个hc05蓝牙,两个usb转串口模块,两块单片机 第一步:进入AT模式 接线图如下所示 HC-0 ...

  2. 毕设测试问题记录1-LCD初始化了但是不工作、初始化顺序、两个单片机用485通信异常、串口标志位TXE和TC

    1.首先是上一个文章提到的问题. (传送门:https://blog.csdn.net/qq_45563820/article/details/124344360?spm=1001.2014.3001 ...

  3. STM32:从菜鸟到牛人就是如此简单!为了学习单片机而去学习单片机的思路是不对的

    来源于知乎,版权归原作者所有 为了学习单片机而去学习单片机的思路是不对的 你问: 如何系统地入门学习stm32? 本身就是一个错误的问题 假如你会使用8051 会写C语言 那么STM32本身并不需要刻 ...

  4. 速率法和终点法的区别_生化分析仪检测中的终点法、两点法、双波长法有什么区别...

    生化分析仪检测中的终点法.两点法.双波长法有什么区别 2018-8-12 14:19 生化分析仪是用于检测人体肝功.肾功.血糖.血脂.心肌酶.离子等项目的仪器,是现在临床上肝.肾.心血管疾病等疾病的必 ...

  5. C++ 内存泄漏检测工具valgrind简单使用

    C++ 内存泄漏检测工具valgrind简单使用 目录 C++ 内存泄漏检测工具valgrind简单使用 valgrind安装 valgrind测试内存泄漏 valgrind安装 通过软件商店下载: ...

  6. 利用LM358制作相移电路并通过STC单片机检测相位差

    电路部分全图 前面部分为相移电路,后部分为整流电路将正弦波转换成方波并将最低电压抬升到0V,使得单片机可以进行正常的电位读取. 相移电路部分 R1,C1,R2,C2部分起到选择正弦波频率的作用,滑动变 ...

  7. 单片机编程软件很简单(23),keil单片机编程软件调试stm32

    单片机编程软件的使用意义较强,不论是工作还是学习,单片机编程软件都是常被使用的软件之一.本文对于单片机编程软件的介绍将基于如何采用keil单片机编程软件调试stm32,如果你对单片机编程软件抑或本文内 ...

  8. python求1到n的乘积_Python简单实现两个任意字符串乘积的方法示例

    本文实例讲述了Python简单实现两个任意字符串乘积的方法.分享给大家供大家参考,具体如下: 题目: 给定两个任意数字组成的字符串,求乘积,字符可能很大,但是python具有无限精度的整数在这里就不需 ...

  9. 【笔试题】简单的两道笔试题(1、打印杨辉三角;2、三个数排序)

    笔试题 简单的两道笔试题(1.打印杨辉三角:2.三个数排序) 1.打印杨辉三角 import java.util.Scanner; public class MyYanghuiTriangle {pu ...

最新文章

  1. 百度云Java三面,面试题及答案!
  2. Jquery ajax调用后台aspx后台文件方法(不是ashx)
  3. 理论物理极础1. 经典物理的本性
  4. java8新特性-lambda表达式和stream API的简单使用
  5. tomcat 外网访问不了_免费云服务器/jdk环境配置/Tomcat简单配置
  6. Python之XML解析详解
  7. IIS执行ASP程序不能调用数据库出现500错误的解决方法
  8. 形态学上的图像顶帽运算和黑帽运算是什么?
  9. How to convert hair particles to mesh in Blender
  10. Effective C++(6) 如何拒绝编译器的自动生成函数
  11. 工作流框架的设计要点
  12. 2022年网络规划设计师最新考纲变化
  13. js中new操作符到底干了什么?
  14. 易语言单窗口单ip软件源码_易语言助手下载-易语言助手 v3.2.0701 官方版
  15. 【P4lang】P4数据平面编程实验basic_tunnel
  16. 微带线和带状线的设计指南
  17. 阿里云招聘深度学习高级算法专家P6-P8(校招和社招)
  18. 华为数字化转型之道 实践篇 第八章 数字化交易:让做生意简单、高效
  19. arcgis 投影坐标系的区分
  20. html焦点图自动轮播,JS实现焦点图轮播效果的方法详解

热门文章

  1. Retrofit2封装之路(请求参数加密解密)(二)
  2. Leetcode刷题系列(一)——巧解数学问题
  3. 基于Qt的Windows平台屏幕颜色拾取器[开源]
  4. C# 使用NModbus 多Slave站编程方法
  5. 你的选择,决定你的精彩?
  6. 排版中字号、磅值、毫米换算表
  7. 计算机一级wps选择题必背知识点,全国计算机一级《WPS》选择题题库及答案2016.doc...
  8. GJB 9001C质量管理体系文件构建(1、质量管理体系文件构架)
  9. MTK 平台的Irq 中断号,dts匹配过程
  10. 【kthreaddi】记录一次被木马攻击hadoop后如何解决