cancel
Showing results for 
Search instead for 
Did you mean: 

Generate PWM with two duty cycles simultaneously

$AK
Associate III

Hello All,

I'm working on PWM on SPC560B54 - Dis by importing and using example source code "SPC560Bxx_RLA PWM-ICU Test Application for Discovery"

I can generate PWM signal with 800kHz and 400kHz frequency but could not change the Pulse width of every pulse I'm generating.

In order to control ws2812 addressable LED, PWM needs to be generated with 60% and 30% duty cycle simultaneously. I tried to generate PWM with two width simultaneously but sometimes one pulse is missed or generated extra. From datasheet ws2812 needs data in 800kHz and 400kHz with 24bits of "1"code(60%) and "0"code(30%) for one led.

/*************************************************************************************************/
#define LED_CNT 1
#define RED 1
#define GREEN 0
#define BLUE 2
 
uint8_t led_buffer[LED_CNT][3],i;
 
 
void glow_led(void)
{
	uint16_t led_no;
	uint8_t led_color,one=1;
	uint8_t bit;
	for(led_no = 0; led_no<LED_CNT; led_no++)
	{
		for(led_color=0; led_color<3; led_color++)
		{
			for(bit = 8; bit>0;bit--)
			{
				if((led_buffer[led_no][led_color]&(one<<(bit-1)))!=0)  /*1 Code*/
				{
					pwm_lld_enable_channel(&PWMD5, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD5, 6000), 0);
				}
				else				   								 /*0 Code*/
				{
					pwm_lld_enable_channel(&PWMD5, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD5, 3000), 0);
				}
			}
		}
	}
	 pwm_lld_enable_channel(&PWMD5, 0, PWM_PERCENTAGE_TO_WIDTH(&PWMD5, 0), 0); /*Reset code*/
	 microsec_delay(50);
	pwm_lld_disable_channel(&PWMD5, 0);
}
 
void led(uint8_t led_num, uint8_t R, uint8_t G, uint8_t B)
{
	led_buffer[led_num][RED] = R;
	led_buffer[led_num][GREEN] = G;
	led_buffer[led_num][BLUE] = B;
	glow_led();
}
 
 
int main(void) 
{
	/* Initialization of all the imported components in the order specified in
	 the application wizard. The function is generated automatically.*/
	componentsInit();
 
	/* Enable Interrupts */
	irqIsrEnable();
 
	/*
	* Initializes the PWM driver 1.
	*/
	pwm_lld_start(&PWMD5, &pwm_config_emios1);
 
	while(1)
		{
		for(i=0;i<LED_CNT;i++)
			{
				led(i,0,255,255);
				osalThreadDelayMilliseconds(1000);
			}
			for(i=0;i<LED_CNT;i++)
			{
				led(i,0,0,0);
				osalThreadDelayMilliseconds(1000);
			}
		}
}
 
/*************************************************************************************************/

system clock - 64MHz, Peripheral Clock - 32MHz, PWM Frequency - 400kHz/800kHz.

Please guide me with above issue or Is there any other possible way to generate different pulses or to control ws2812.

Regards,

AK

1 ACCEPTED SOLUTION

Accepted Solutions
$AK
Associate III
5 REPLIES 5
$AK
Associate III
Javier1
Principal
$AK
Associate III

But my MCU doesn't (SPC560B50L5) support DMA, because of that we have try different methods.

Now it is solved with SPI.

https://community.st.com/s/question/0D53W00000dOY29SAG/generate-pwm-with-two-duty-cycles-simultaneously

Regards,

AK

its actually the first time i hear about that architecture.

What do you use it for?

$AK
Associate III

Its a project requirement from one of our client, to control WS2813 with SPC560B50L5.