Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: FastAnalogIn fastADC
Revision 114:cb1ac5905df4, committed 2019-12-08
- Comitter:
- yutonggu
- Date:
- Sun Dec 08 05:27:35 2019 +0000
- Parent:
- 113:233a2fac1911
- Commit message:
- Changed to use fastADC and sample at 20KHz
Changed in this revision
| fastADC.lib | Show annotated file Show diff for this revision Revisions of this file |
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fastADC.lib Sun Dec 08 05:27:35 2019 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/teams/SafeDetect/code/fastADC/#d415e0b7dc3e
--- a/main.cpp Tue Dec 03 22:39:22 2019 +0000
+++ b/main.cpp Sun Dec 08 05:27:35 2019 +0000
@@ -9,6 +9,7 @@
#include <AnalogIn.h>
#include <AnalogOut.h>
#include "circ_buff.hpp"
+#include "fastADC.h"
AnalogOut v_src(GPIO0);
@@ -28,35 +29,33 @@
#define WINDOW_SIZE DEF_WINLENGTH - DEF_FRAMESHIFT
#define ARRAY_SIZE 800
-#define BUFFSIZE 11100 // size of buffer = sampling_time * sampling_rate * size(float)
+#define BUFFSIZE 1000 // size of buffer = sampling_time * sampling_rate * size(float)
//DigitalOut led1(LED1);
//DigitalOut led2(LED2);
Thread thread_adc;
Thread thread_mfcc;
+Ticker read_ADC_ticker;
// PIN DEFINITIONS
DigitalOut vcc(GPIO0);
AnalogIn mic(PB_0);
CircularBuff<uint16_t> buff(BUFFSIZE);
+Serial pc(USBTX, USBRX);
-int num_readings = 0;
+volatile int num_readings = 0;
int z = 0;
-uint16_t raw_adc = 0;
+volatile uint16_t raw_adc = 0;
uint16_t* pop_val;
void adc_thread() {
- while (true) {
- for (;;) { /* Loop forever */
- if (ADC1->SR & (1 << 1)) { /* If conversion has finished */
- raw_adc = ADC1->DR & 0x0FFF; /* Read AD converted value */
- ADC1->CR2 |= 1 << 22; /* Start new conversion */
- }
- buff.push(raw_adc);
- num_readings++;
- }
+// while (true) {
+// wait_us(42);
+ raw_adc = readADC(); /* Read AD converted value */
+ num_readings++;
+
- }
+// }
}
//To sleep, 'wait' should be replaced by 'ThisThread::sleep_for' (C++) or 'thread_sleep_for' (C). If you wish to wait (without sleeping), call 'wait_us'. 'wait_us' is safe to call from ISR context. [since mbed-os-5.14] [-Wdeprecated-declarations] in "main.cpp", Line: 59, Col: 9
@@ -67,12 +66,13 @@
void mfcc_thread() {
while (true) {
//printf("Top of MFCC thread");
- thread_sleep_for(2000);
- printf("Readings / second: %i\n\n", num_readings/2);
+ thread_sleep_for(5000);
+ double rate = num_readings/5000.0;
+ pc.printf("Readings / second: %f Ksps\n\n", rate);
num_readings = 0;
- pop_val = buff.pop();
- printf("last reading: %u\n", *pop_val);
- buff.clear();
+ //pop_val = buff.pop();
+ //pc.printf("last reading: %u\n", *pop_val);
+ //buff.clear();
}
}
@@ -91,14 +91,15 @@
DMA_CCRx register
6. Activate the channel by setting the ENABLE bit in the DMA_CCRx register
*/
-
-void config_dma() {
- /*
- 1. Set the peripheral register address in the DMA_CPARx register. The data will be
- moved from/ to this address to/ from the memory after the peripheral event.
- */
- //RCC->DMA_CPAR1 &= 0x00000000;
-}
+//
+//void config_dma() {
+// /*
+// 1. Set the peripheral register address in the DMA_CPARx register. The data will be
+// moved from/ to this address to/ from the memory after the peripheral event.
+// */
+// //RCC->DMA_CPAR1 &= 0x00000000;
+//
+//}
@@ -107,24 +108,21 @@
int main() {
- config_dma();
- printf("configuring DMA\n");
+// config_dma();
+ pc.printf("configuring DMA\n");
- printf("Creating buff of size %d\n", BUFFSIZE);
+ pc.printf("Creating buff of size %d\n", BUFFSIZE);
/* clear the buffer */
- buff.clear();
- printf("library read val: %u\n", mic.read_u16());
+// buff.clear();
+ pc.printf("Setting up ADC\n");
-// /* Setup and initialize ADC converter https://www.davidkebo.com/microcontroller-interfacing */
-// RCC->APB2RSTR |= 1 << 9; /* Enable ADC1 clock */
-// GPIOA->ARL &= 0xFFF0FFFF; /* Configure PC4 as ADC.14 input */
-// ADC1->SQR1 = 0x00000000; /* Regular channel 1 conversion */
-// ADC1->SQR2 = 0x00000000; /* Clear register */
-// ADC1->SQR3 = 14 << 0; /* SQ1 = channel 14 */
-// ADC1->SMPR1 = 5 << 12; /* Channel 14 sample time is 55.5 cyc */
-// ADC1->SMPR2 = 0x00000000; /* Clear register */
-// ADC1->CR1 = 1 << 8; /* Scan mode on */
-// ADC1->CR2 = (1 << 20) | /* Enable external trigger */
+ /* Setup and initialize ADC converter https://www.davidkebo.com/microcontroller-interfacing */
+// RCC->APB2RSTR |= 1 << 9; /* Enable ADC1 clock */
+ initADC();
+// ADC->SMPR1 = 5 << 12; /* Channel 14 sample time is 55.5 cyc */
+// ADC->SMPR2 = 0x00000000; /* Clear register */
+// ADC->CR1 = 1 << 8; /* Scan mode on */
+// ADC->CR2 = (1 << 20) | /* Enable external trigger */
// (7 << 17) | /* EXTSEL = SWSTART */
// (1 << 1) | /* Continuous conversion */
// (1 << 0) ; /* ADC enable */
@@ -134,18 +132,18 @@
// while (ADC1->CR2 & (1 << 2)); /* Wait for calibration to finish */
// ADC1->CR2 |= 1 << 22; /* Start first conversion */
//
-// for (;;) { /* Loop forever */
-// if (ADC1->SR & (1 << 1)) { /* If conversion has finished */
-// raw_adc = ADC1->DR & 0x0FFF; /* Read AD converted value */
-// ADC1->CR2 |= 1 << 22; /* Start new conversion */
-// }
-// printf("register read val: %u\n", raw_adc);
-// thread_sleep_for(2000);
+
+ //for (;;) { /* Loop forever */
+// raw_adc = readADC();
+// pc.printf("register read val: %u\n", raw_adc);
// }
- while(1);
- thread_adc.start(adc_thread);
+
+ read_ADC_ticker.attach_us(&adc_thread, 50);
thread_mfcc.start(mfcc_thread);
+ while(1){
+ thread_sleep_for(10000);
+ }
}
\ No newline at end of file