赞
踩
红叶何时落水
校赛第二部分
详见
利用定时器的输入捕获模式来测量相位差
通过 (两路波形上升沿的时间差 / 波形周期)* 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);
- }
- }
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。