Devices & Components
Trimmer Potentiometer, 10 kohm
Switch Actuator, Key-operated Selector Switches
Potentiometers
Hardware & Tools
Soldering Iron Kit, Battery
Software & Tools
Arduino IDE
Project description
Code
Code Frequency meter
cpp
...
1#include <LedControl.h>//https://github.com/wayoda/LedControl/archive/master.zip 2 LedControl lc = LedControl(PB1,PB10,PB11,1);// DIN(PB1), CLK(PB10), CS(PB11) 3 4 volatile int mon_flag; 5 unsigned long freq; 6 byte fq[8],pd,x; 7 8void setup() { 9 Serial.begin(9600); 10 lc.shutdown(0, false); 11 lc.setIntensity(0,8); // яркость 0-15 12 lc.clearDisplay(0); 13 pinMode(PA15,INPUT_PULLDOWN); // вход частотомера 14 15 RCC_BASE->APB1ENR|= (1<<2)|(1<<1)|(1<<0); //включить тактирование tim-2,3,4 16 RCC_BASE->APB2ENR|= (1<<3)|(1<<11)|(1<<2)|(1<<0)|(1<<4);////включить тактирование port-a-b-c,tim1 17 AFIO_BASE->MAPR=(1<<8)|(1<<6); //tim 1 && tim 2 Partial remap 18} 19 20void loop() { 21 freq_meter(); 22 Serial.println(freq); 23 fq[7]= freq/10000000%10; 24 fq[6]= freq/1000000%10; 25 fq[5]= freq/100000%10; 26 fq[4]= freq/10000%10; 27 fq[3]= freq/1000%10; 28 fq[2]= freq/100%10; 29 fq[1]= freq/10%10; 30 fq[0]= freq%10%10; 31 32 if(freq>=10000000){x=8;} 33 if(freq<10000000){lc.setRow(0,7,0);x=7;} 34 if(freq<1000000){lc.setRow(0,6,0);x=6;} 35 if(freq<100000){lc.setRow(0,5,0);x=5;} 36 if(freq<10000){lc.setRow(0,4,0);x=4;} 37 if(freq<1000){lc.setRow(0,3,0);x=3;} 38 if(freq<100){lc.setRow(0,2,0);x=2;} 39 if(freq<10){lc.setRow(0,1,0);x=1;} 40 41 for(int i = 0;i < x;i++){ 42 if(i==3){pd=true;} 43 else if(i==6){pd=true;} 44 else if(i==9){pd=true;} 45 else{pd=false;} 46 lc.setDigit(0,i,fq[i],pd);} 47} 48 49void freq_meter(){ // http://arduino.ru/forum/proekty/generator-s-reguliruemoei-chastotoi-na-arduino#comment-296530 50 __asm volatile( "cpsid i" ); 51 /// Timer2 счёт младших 16 бит 52 TIMER2_BASE->CR1=0;//стоп таймер 53 TIMER2_BASE->CCER=0; TIMER2_BASE->PSC=0; TIMER2_BASE->CNT=0; 54 TIMER2_BASE->CCR1=0; TIMER2_BASE->CCR2=0; TIMER2_BASE->CCR3=0; 55 TIMER2_BASE->CCR4=0;TIMER2_BASE->PSC=0;TIMER2_BASE->SR=0; 56 TIMER2_BASE->CCMR2=0; 57 TIMER2_BASE->CR2=1<<5; //MMS:010 управление подчинённым в режиме "Update" 58 TIMER2_BASE->SMCR= (1<<14);// ECE & TS:000 режим 2 внешнего тактирования & разрешение работы от таймера1 59 TIMER2_BASE->ARR=65535; //считать до максимума 60 TIMER2_BASE->EGR=1; //перечитать регистры. 61 TIMER2_BASE->CR1|=(1<<0);//start timer2 62 /// Timer3 счёт старших 16 бит 63 TIMER3_BASE->CR1=1<<0;//стоп таймер 64 TIMER3_BASE->CCER=0; TIMER3_BASE->PSC=0; TIMER3_BASE->CNT=0; 65 TIMER3_BASE->CCR1=0; TIMER3_BASE->CCR2=0; TIMER3_BASE->CCR3=0; 66 TIMER3_BASE->CCR4=0;TIMER3_BASE->PSC=0;TIMER3_BASE->SR=0;TIMER3_BASE->CR2=0; 67 TIMER3_BASE->CCMR1=0; 68 TIMER3_BASE->SMCR=(1<<2)|(1<<1)|(1<<0)|(1<<4);//SMS:111 && TS:001 такт брать от 2-го таймера 69 TIMER3_BASE->ARR=65535; //считать до 70 TIMER3_BASE->EGR=1; //перечитать регистры. 71 TIMER3_BASE->CR1|=(1<<0);//start timer3 72 /// настройка времени разрешения на таймере1 для таймера2 73 TIMER1_BASE->CR1=(1<<3)|(1<<2);//один импульс, без прерываний 74 TIMER1_BASE->CNT=0; 75 TIMER1_BASE->CR2=(1<<4); //MMS:001 сигнал разрешения работы другим таймерам 76 TIMER1_BASE->CCER=0;// отключить выходы таймера на физ ноги 77 TIMER1_BASE->PSC=F_CPU/36000 -1 ;// 1999; // 72000000/2000= 36000кГц тактовая таймера 78 TIMER1_BASE->ARR=35996;//считать до 36000 (1секунда) 79 TIMER1_BASE->EGR=1; //перечитать регистры. 80 TIMER1_BASE->CR1|=(1<<0); 81 __asm volatile( "cpsie i" ); 82 while (TIMER1_BASE->CR1&1) {asm volatile("nop"); if(mon_flag) {return;} } 83 freq = TIMER3_BASE->CNT<<16 | TIMER2_BASE->CNT ; 84}
Documentation
Schematic
...
Schematic.jpg

Comments
Only logged in users can leave comments