Help Required: Comparator Interrupt based Time measurement
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2024-04-04 9:49 AM - edited ‎2024-04-04 9:56 AM
Hello everyone, this is my first post on ST after starting to use the STM32F072RB on the Nucleo Board. It has been only 3 months since I started working with ST parts, so pardon my missing knowledge and misconceptions. This personal project has been stressing me out too much now, so reaching out to all the amazing brains out here for input, help and support. I am new to STM32, ARM Cortex, STM IDE, and STMCube. Please be nice.. :)
So, I am trying to configure a hardware connection between STM32F072 and a chip that works with parasitic power supply allowing power and communication through a single wire. It is similar to OWS but hacky version of it.
Anyway, I have been able to start the transmission to the slave and I am able to get the response through the hardware and I can see that on the oscilloscope as shown in the image below:
The blue signal is the power line that shows transmission pulses and the small noise like reception pulses. This response is fed into the hardware that also includes the comparator and the pink/purple signal is the response on PA0, that is the forwarded output of COMP1 to the external pin.
The comparator interrupts are enabled after the transmission is done, before the slave starts to respond. I expect to get 8 bits of data as this is the reset command, and I am getting that on the scope.
I am not really a professional firmware developer or programmer so I struggle whenever there is complicated code involved. The problem I have here is, I am not able to configure the timer such that it stores and resets the value between the pulses. I have a variable in the code say 'response_interval' which I need to store the time value in microseconds between the two consecutive pulses, I have logically written the conversion part of these intervals to binary values (only need to change the comparison numbers maybe).
Long story short, any step by step help to start the timer once the first pulse is received, store the value in a variable, reset the time count and start again, the values of the time could be stored in an array or converted into binary in real time - (which should not be a problem I hope, fingers crossed).
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2024-04-04 10:42 AM
Hi,
for me : information missing : which sensor ? Signal looks "digital" , so why using comparator ?
+
A timer can be set to capture pulse length by itself - but first need more info, whats needed here.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2024-04-04 10:50 AM - edited ‎2024-04-04 10:59 AM
It is not a sensor. It is an EEPROM.
The signal back from the slave is a very small transition of 100mV, I do not know a way of digitally isolating a high from low with 100mV of difference, so to 'amplify' it was fed into the comparator to get a strong/nice(r) signal.
Also, I do know the logic, and the implementation of the idea. I am not able to put them in a code. I guess I am not able to understand the timer configuration/trigger and time value storage.
need to capture and store t ^ in a variable, and then continue until the number of bits are done.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2024-04-04 11:17 AM
EEPROM - type ?
+
timing pulse/gap for "1" and "0" ?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2024-04-04 11:21 AM
No datasheet available for the EEPROM.
the pulse/gap for 1 is 8-10us, for 0 is 15-18us
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2024-04-04 12:05 PM
So basically at so small signal your idea to use comparator is good.
You could also set comparator to both inputs external and connect (-IN) to DAC output, to adjust the switching level very fine.
To use a timer, to capture a pulse, connect comparator output to TIMxCH1 input, to have the signal at the timer capture channel.
Then set this timer to a useful timing for your job here, maybe 10MHz clock to get 100ns steps .
I use this mode (at 1MHz, 1us steps), for receiving IR remote signals, this working perfect (400us/600us/1200us pulse/gap timings).
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2024-04-04 12:15 PM
@AScha.3 wrote:To use a timer, to capture a pulse, connect comparator output to TIMxCH1 input, to have the signal at the timer capture channel.
Then set this timer to a useful timing for your job here, maybe 10MHz clock to get 100ns steps .
Funny thing is, I know this, and I am trying to do this, and I am not able to do this. LOL.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2024-04-04 12:54 PM
Yes, not super easy...i show you : i use tim5 here, but up to you, to use another :
I have 96MHz clock, so you have to adjust prescaler : (tim core clk) / (xx-1) -> 0,1us (at 48MHz : psc 4 -> about 0,1us);
counter period : set what maximum time could be, more is not possible, so counter limits by itself to this time.
input filter: to suppress short spikes .
To start setup in main :
HAL_TIM_IC_Start_IT(&htim5, TIM_CHANNEL_2); // capture in start
and in INT check pulses and shift your pulses together :
void TIM5_IRQHandler(void)
{
/* USER CODE BEGIN TIM5_IRQn 0 */
static uint16_t pnr, cmdnr, IRpuls[15],IRcmd[5];
uint16_t val=TIM5->CCR2; // get puls in microsec. (3000us max. timer ARR)
if(val>1800) pnr=0; // 2ms puls found -> start sequence
IRpuls[pnr++]= val; // store puls us
if(pnr>12) // Sony IR hat 12 bit + start
{
pnr=0; // reset seq.
IRcmd[cmdnr]=0; // preset 00
for(uint16_t aa=1;aa<13;aa++)
{
if(IRpuls[aa]>400 )IRcmd[cmdnr] <<= 1; // > 400us ? shift in 0 (exact: 600us)
if(IRpuls[aa]>1000)IRcmd[cmdnr] |= 0x01; // > 1000us ? shift in 1 (exact: 1200us)
}
cmdnr++; // for next
.....
here for my IR receiving of Sony SIRCS code , 12 bits ...)
