Sin wave generation problem using TIM1 & PWM
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2016-03-02 2:17 PM
I am a student from University of Cairo Iam trying to generate a 50 hz sinusoidal using my stm32f4 discovery board. I am running my timer in 10khz (switching freq = 10khz) and I am using a lookup table (generated from excel) in order to get new compare values for my pwm => lookup table of 200 points. The discovery board and my timer 1 are running on 168Mhz. My timer is in up-down count mode with period = 8400 - 1 . The new compare value is obtained on overflow and updated. But its effect takes place on next underflow because of shadowing . I am able to get 50hz but it is not a pure 50hz. It has other frequency components which makes it moving around as can be seen in attachment. I have an RC filter placed on channel 1 of timer 1 on PE9 to make the sin wave visible.
What is the reason of not getting a pure 50hz although my sin table is pure 50hz? I attach my code for you to take a look please.Thank you for your help!- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2016-03-02 4:03 PM
Like I told the last guy, the Update interrupt doesn't need you to check the CNT value, just qualify that the Update is the source.
Up vote any posts that you find helpful, it shows what's working..
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2016-03-03 9:12 AM
Hello Clive1 I removed the checking on the CNT but the problem didn't solve and now i am getting 100 hz fundamental sin wave instead of 50hz because i am updating the sin table on overflow and underflow (see attachement). this is why i was checking CNT to detect overflow and update the compare value only once per cycle. What can be done about this?
Thank you for your help. ________________ Attachments : pic.png : https://st--c.eu10.content.force.com/sfc/dist/version/download/?oid=00Db0000000YtG6&ids=0680X000006I0nv&d=%2Fa%2F0X0000000bgc%2FKbPEGpLY7QcVMyJSz2kYsflKVEq9vjOmIrk5OayYmj4&asPdf=falsepic2.png : https://st--c.eu10.content.force.com/sfc/dist/version/download/?oid=00Db0000000YtG6&ids=0680X000006I0zG&d=%2Fa%2F0X0000000bgb%2F1CNSmzm8pqsm7uBb.K8NJsOYy61dRwEumsn6Ft2cUDs&asPdf=false- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2016-03-03 9:46 AM
I see, it's in the centred mode, sure you need that for this?
I'd use the DIR bit of the TIMx->CR1 to determine the Update I was looking at, not the CNT value.Up vote any posts that you find helpful, it shows what's working..
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2016-03-03 10:01 AM
I tried edge aligned mode once but i got similar results. In literature review they say that its better to use symmetric pwm.
I did what you told me and i am using DIR however problem is still happening.Thank you for your help Clive1 ! I hope we can find a logic explanation to this because I don't know what is causing this.- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2016-03-03 11:12 AM
has anyone experienced something like this? Is it a limitation in mcu or software bug that i have to fix ? Thanks you
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2016-03-03 1:29 PM
Attached two example .HEX file, write with ST-LINK Utilities. Evaluate the signals here and report.
________________ Attachments : PWM1_50HZ_TEST1.hex : https://st--c.eu10.content.force.com/sfc/dist/version/download/?oid=00Db0000000YtG6&ids=0680X000006I0zB&d=%2Fa%2F0X0000000bgY%2FS_HlNRNd_XVHqwJWGOlAmHedTUG_tFSyCY.JzSmHU20&asPdf=falsePWM1_50HZ_TEST2.hex : https://st--c.eu10.content.force.com/sfc/dist/version/download/?oid=00Db0000000YtG6&ids=0680X000006I0wJ&d=%2Fa%2F0X0000000bga%2FF93TFS6ECF4TkI4Eq6Koq0W9w_8vVmjeklwHIZlTmtM&asPdf=falseUp vote any posts that you find helpful, it shows what's working..
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2016-03-04 3:26 PM
Hello Clive1. Thank you for your help. I tried both of hex files. The first has generated sin wave with amplitude aboute 1.65V and 50hz, but again it wasn't a pure 50hz, it had other frequency components. Comparing with the output seen from my code, your code was generating extra components i think on lower frequency component because the whole wave (50Hz + other) varied slower. For seconde hex I saw upper side of sin (positif cycle) but also the wave was not stable and increasing time axis on osxillocope showed that other components were also present (wavy signal).
I was trying different configurations for my timer to see what changes. The modulated sin wave is 0.5*sin(2*pi ... ). I tried increasing prescaler from 0 to 21-1 (makes 8 mhz timer 1) and period to 400-1 (10khz switching). I saw the expected 50 hz signal but other frequency components were also coming in at frequencies lower than 50Hz. So i conclude that the additional frequency components were different than the one seen with the timer configuration I previously had in my code with no prescaler and period=8400-1 (the code posted in my 1st post). Why is this so?Another very unusual thing that is happening is that for all timer configurations i mentioned before when i change modulating sin wave from 0.5*sin(2*pi ... ) to 1*sin(2*pi ... ) i am able to get a very clean 50hz with no extra components. How come is this possible? Is there something logical behind this? Thanks for your help.