I am looking at using your boards instead of an Arduino. Where would I find information about how many timers or PWM Pins are available to me. For my project I am sending pulses to stepper drivers. So I would need to adjust the frequency of any PWM.
I saw this
It states there are 17 timers which would be available to me
@russell, the Core only has three main timers available, each with 4 channels which can be configured for various functions. Each main timer/prescaler sets the clock for its 4 channels. At this time, because of extensive pin remapping on the Core, the PWM frequency used by analogWrite is set to 500Hz. However, if you carefully map your PWM pins to their associated timers, you can program the PWM frequency to whatever you want. The datasheet you pointed to is for the STM32F2xx series which will be used by the Photon. The Core uses the STM32F103.
Yes I am looking at the possibility of using the Photon. The data sheet says it has 12 timers so I was thinking it would be good to use this board for control of 8 stepper motors 4 with 2 joy sticks & 6 with code & acceleration ramps.
Of course at the price I could use 2 or 3 boards which might suit me at this time I am using an arduino Mega & ethernet shield.
As you mention sometimes not all the functions of a microprocessor chip are available on a board so I was interested in finding out how practical it would be for me to consider the photon as I love the WIFi option
@russell, it is important to note that the Photon will be running FreeRTOS, a real-time operating “kernel”. The number of timers available is linked to how the Photon’s GPIO pins will be mapped. I have discussed with @mdma about creating a HAL layer library for managing timers in both the Core and the Photon. It is easy to configure a timer when all its channels are committed to the same function (eg. PWM). It is not so easy when you want one channel doing PWM at 5KHz and another channel producing interval interrupts at 1ms intervals. This is the challenge.
Guys, now that this is a few months old, I was wondering if we’re any closer to being able to use custom PWM and interval interrupts on the Photon?
I’ve used custom PWM on the Core along with @peekay123’s most excellent SparkIntervalTimer to make a custom PWM fan controller (timer being used to track tach output) and would love to be able to do this on the Photon.
Looks like it’s still possible to change the PWM frequency by copying the logic in the HAL_PWM_Write routine and using a different TIM_PWM_FREQ. But the SparkIntervalTimer library is rather outside of my skill level and I am not sure if this approach even makes sense anymore, given the new HAL.
@peekay123, how hard would it be to port SparkIntervalTimer to the Photon? I am willing to sacrifice other channels on the same timer in order to be able to get this, as long as I don’t lose SPI, I2C, and Serial connectivity.
@peekay123 I tried to build the SparkIntervalTimer for my photon project and hit the following linker errors - haven’t explored too much at the minute but any ideas?
In function `__static_initialization_and_destruction_0':
..particle/firmware/user/../../../src/Pump.cpp:49: undefined reference to `Wiring_TIM2_Interrupt_Handler'
..particle/firmware/user/../../../src/Pump.cpp:49: undefined reference to `Wiring_TIM3_Interrupt_Handler'
..particle/firmware/user/../../../src/Pump.cpp:49: undefined reference to `Wiring_TIM4_Interrupt_Handler'
@mterrill, on the Photon, PIN_MAP is now “hidden” by the HAL so you need to create a local copy using STM32_Pin_Info* PIN_MAP = HAL_Pin_Map(); at the top of AnalogWrite2(). Without this, the code will not be able to access the correct timer registers. DO remember that changing a timer’s value will affect all of its channels:
PIN TMR3 TMR4 TMR5
I must admit, I’ve given it a good go but still it seems to be evading me.
I believe I’ve been running basic PWM on D0. IE able to scale from 0 - 65k (default period) and get the fan to act accordingly, though it refuses to budge at less than 30%. The humming and the lack of fan movement suggests 25khz is not being written, which is backed up by setting the max value of the period and it still doesn’t kick life into it. Just using 65k as the value seems to show the period is being ignored.
So, the code. I understand D0 is TIM4 and CH2 so have been pursuing your suggested angle. I can’t get the following to work, despite correlating what seem to be multiple sources in agreement
@mterrill, I have to admit to being thoroughly confused as to what you are trying to do. The code you are using from @BDub uses the PWM mode of a timer where the base frequency and the period are configured through timer hardware registers. The amarkham link you provided uses the Output Compare mode of a timer, which is how the Tone() library works. You can’t mix the two. I will need to spend more time on your code to figure out what you are doing. Do you have an oscilloscope?