2016-06-14 08:32 AM
Hi everyone,
I'm quite new in the world of stm32 and microcontrollers in general. Here is the thing: I want my f334 to generate a sine waveform which is going out by the DAC. I want it to adapt the frequency of the sine depending of a voltage it receives as an input, but basically I try to have 170kHz as output. I mainly use mbed, and very recently tried Keil. I found several examples, and I tried to use it as a start, but I can't go far. Here is the code I use, from github:https://gist.github.com/donghee/9748245
#include ''mbed.h''
// Audio output demo for speaker
// generates a 500Hz sine wave on the analog output pin
// 128 data points on one sine wave cycle are precomputed,
// scaled, stored in an array and
// continuously output to the Digital to Analog convertor
AnalogOut DAC(p18);
// conflict with the DAC name, I changed to AnalogOut dacout(PA_4)
//global variables used by interrupt routine
volatile
int
i=0;
float
Analog_out_data[128];
//I tried to put 256 instead of all the 128 (just to test) but it doesn't work
// Interrupt routine
// used to output next analog sample whenever a timer interrupt occurs
void
Sample_timer_interrupt(
void
)
{
// send next analog sample out to D to A
DAC = Analog_out_data[i];
// increment pointer and wrap around back to 0 at 128
i = (i+1) & 0x07F;
}
int
main()
{
// set up a timer to be used for sample rate interrupts
Ticker Sample_Period;
// precompute 128 sample points on one sine wave cycle
// used for continuous sine wave output later
for
(
int
k=0; k<128; k++) {
Analog_out_data[k]=((1.0 + sin((
float
(k)/0*6.28318530717959)))/2.0);
// scale the sine wave from 0.0 to 1.0 - as needed for AnalogOut arg
}
// turn on timer interrupts to start sine wave output
// sample rate is 500Hz with 128 samples per cycle on sine wave
//So when I put 10000 instead of 500 it outputs 1.3kHz
Sample_Period.attach(&Sample_timer_interrupt, 1.0/(500.0*128));
// everything else needed is already being done by the interrupt routine
while
(1) {}
}
The problem is, it works for this frequency of 500Hz, but when I try higher frequencies (like 1kHz, 5kHz, 10kHz etc.) it can't go higher than 1.3kHz. I have read many, many forums, datasheets, codes, to try to understand by myself how to do it, but I failed.
I used AN3126 because it seems to be exactly what I'm looking for, but when I look at the setting the frequency part, it just says to configure TIMER6, or TIM6_TRG, more or less.
I have found
/public/STe2ecommunities/mcu/Lists/STM32Discovery/Flat.aspx?RootFolder=https://my.st.com/public/STe2ecommunities/mcu/Lists/STM32Discovery/Timer%20value%20calculation&FolderCTID=0x01200200770978C69A1141439FE559EB459D75800084C20D8867EAD444A5987D47BE638E0F¤tviews=6536
where someone had to use timers and all, but I don't know where i should put the whole initialization part (this is a minor detail, though, I think the main.cpp is fine), and more, I can't find something like TIM_TimeBaseStructure in my libraries, for example. My big problem is that mbed is very clean and this is cool, but I don't know what lies for real in the mbed libraries. So I tried to export my project into Keil, and what I see is that many libraries are HAL (likestm32f3xx_hal_tim.h
orstm32f3xx_hal_dac.h
for example), which is something else that disturbs me. Also, I may have to use the integrated PLL, but I put it aside at first because I thought the input and output clock were too high for what I need, but now I'm starting to think I was wrong. But, meh, I can't manage a PLL either.... I hope some of you could help me, in any way, because I really need it. I'm stuck on this for two or three weeks (yes I'm bad) and I'm running out of time. Sometimes lurking is not enough. What I understand is that the DAC is bounded to timer6 (and timer7), and APB1 plays a part in that. I don't ask for the solution, of course, only for method, advice, anything. This is something I really want to get into, but it looks like I can't do it on my own. If you need any technical information or else, I will gladly provide them; I just didn't know what could be useful. Here are the two files I used (or try to use): Audio and waveform generation using the DAC - Extending DAC performances- Thank you very much for your time. #trigger #sine-waveform #stm32f334 #timer2016-06-14 09:03 AM
Can't help you with mbed or HAL..
The DAC typically has an output rate of up to 1Msps, you're not going to be able to do a 128 point 170 KHz (21.76 MHz) with it. You're also not going to be able to use interrupts beyond a few hundred KHz, so this will put a ceiling on that method too. To get higher rates you'd need to use DMA to service the DAC via a timer. The DAC doesn't support floats, it uses 12-bit integers, you'll have to preformat the pattern buffer (wave table) to fit the hardware expectations.2016-06-14 09:16 AM
[DEAD LINK /public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/sawtooth&FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B¤tviews=97]https://my.st.com/public/STe2ecommunities/mcu/Lists/cortex_mx_stm32/Flat.aspx?RootFolder=%2Fpublic%2FSTe2ecommunities%2Fmcu%2FLists%2Fcortex_mx_stm32%2Fsawtooth&FolderCTID=0x01200200770978C69A1141439FE559EB459D7580009C4E14902C3CDE46A77F0FFD06506F5B¤tviews=97
Dual DMA DAC example half way down here, search ''Dual DAC 6.25 KHz Sine''2016-06-15 01:33 AM
Hello clive, thank you for your quick answer.
I'm going to study carefully the two links you gave me, take your advice in account in my thought process, and I will keep you in touch very soon. Thanks again :) Edit: I almost forgot, but it's in fact a major problem I have:where are the libraries for my device?
I guess they're all grouped in a TARGET_NUCLEO folder generated when I select my device, but I can't find them. I apologize for some questions that may seem very basic, but the wonderful thing is that i can't find the answers on the internet. Like blinky.cpp for my F334, I have no idea where I can have it.