PWM STM8S

vancongck

Học sinh phổ thông
#1
Để đáp lại tinh thần chia sẻ một số anh em đã chia sẻ! Mình đưa code về PWM STM8S cho các bạn tham khảo!
Để nhìn rõ hơn về xung PWM mình thêm vào hàm delay! giữa các chu kỳ xung cho nó thể hiện rõ ràng hơn! với xung xuất ra chân PD4!
Với kít thực hành đơn giản cho những bạn muốn thực hành chỉ cần có một bộ nạp ST_LINK V2 giá 150K+một chíp STM8S003(10K) và 2 con tụ gốm 104 và 1 con trở 1k + mạch PCB28 có sẵn tại các cửa hàng bán linh kiện và ráp và hàn vo là OK! sơ đồ bạn có thể nắp ráp theo sơ đồ bên dưới!
Phần code full bên dưới!
PWM_____.png

HTML:
//-----------------------------------------------------------------------
//
// NGUYEN VAN CONG
// http://ceesgroup.blogspot.com
// kit mini STM8S103
//
//-----------------------------------------------------------------------
#include "stm8s_conf.h"
uint16_t CCR1_Val = 500;
uint16_t CCR2_Val = 250;
uint16_t CCR3_Val = 125;
//uint16_t CCR1_Val_1;
void Delay(uint16_t nCount);
static void TIM2_Config(void);
static void TIM2_PWM1(uint16_t CCR1_Val_2);

/*
         - TIM2_CH1  pin (PD.4)
         - TIM2_CH2  pin (PD.3)
         - TIM2_CH3  pin (PA.3)
   Các TIM2CLK là 2MHz, các Prescaler là 1 nên TIM2 clock truy c?p là 2MHz.

   Các TIM2 f= 2 KHz: TIM2 Frequency = TIM2 clock counter / (ARR + 1)
   TIM2 là 2KHz.


   Các TIM2 CCR1 gia tri dang ky 500, nên TIM2 Channel 2 Kênh 1 tao ra  mot
   tin hieu PWM voi tan so 2KHz và mot chu ky nhiem 50%:
   Chu ky nhiem vu TIM2 Channel1 = [TIM2_CCR1 / (TIM2_ARR + 1)] * 100 = 50%

   Các TIM2 CCR2 gia tri dang ky 375, nên TIM2 Channel 2 Kênh 1 tao ra  mot
   tin hieu PWM voi tan so 2KHz và mot chu ky nhiem 25%:
   Chu ky nhiem vu TIM2 Channel2 = [TIM2_CCR2 / (TIM2_ARR + 1)] * 100 = 25%

   Các TIM2 CCR3 gia tri dang ky 250, nên TIM2 Channel 2 Kênh 1 tao ra  mot
   tin hieu PWM voi tan so 2KHz và mot chu ky nhiem 50%:
   Chu ky nhiem vu TIM2 Channel3 = [TIM2_CCR3 / (TIM2_ARR + 1)] * 100 = 12,5% 

 
*/

void main(void)
{
  /* TIM2 configuration -----------------------------------------*/
  /*TIM2_Config(); */

  while (1)
  { 
    TIM2_PWM1(10);
    Delay(0xFFFF);
    TIM2_PWM1(100);
    Delay(0xFFFF);
    TIM2_PWM1(200);
    Delay(0xFFFF);
    TIM2_PWM1(300);
    Delay(0xFFFF);
    TIM2_PWM1(500);
    Delay(0xFFFF);
    TIM2_PWM1(600);
    Delay(0xFFFF);
    TIM2_PWM1(700);
    Delay(0xFFFF);
    TIM2_PWM1(800);
    Delay(0xFFFF);
    TIM2_PWM1(900);
    Delay(0xFFFF);
    //===========================================
     TIM2_PWM1(900);
    Delay(0xFFFF);
     TIM2_PWM1(800);
    Delay(0xFFFF);
     TIM2_PWM1(700);
    Delay(0xFFFF);
     TIM2_PWM1(600);
    Delay(0xFFFF);
     TIM2_PWM1(500);
    Delay(0xFFFF);
     TIM2_PWM1(400);
    Delay(0xFFFF);
     TIM2_PWM1(300);
    Delay(0xFFFF);
     TIM2_PWM1(200);
    Delay(0xFFFF);
     TIM2_PWM1(100);
    Delay(0xFFFF);
     TIM2_PWM1(10);
    Delay(0xFFFF);
  }
}
static void TIM2_PWM1(uint16_t CCR1_Val_2)
{
  /* Time base configuration */
  TIM2_TimeBaseInit(TIM2_PRESCALER_1, 999);
  /* PWM1 Mode configuration: Channel1 */
  TIM2_OC1Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE,CCR1_Val_2, TIM2_OCPOLARITY_HIGH);
  TIM2_OC1PreloadConfig(ENABLE);
  TIM2_ARRPreloadConfig(ENABLE);

  /* TIM2 enable counter */
  TIM2_Cmd(ENABLE);
}
static void TIM2_Config(void)
{
  /* Time base configuration */
  TIM2_TimeBaseInit(TIM2_PRESCALER_1, 999);

  /* PWM1 Mode configuration: Channel1 */
  TIM2_OC1Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE,CCR1_Val, TIM2_OCPOLARITY_HIGH);
  TIM2_OC1PreloadConfig(ENABLE);

  /* PWM1 Mode configuration: Channel2 */
  TIM2_OC2Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE,CCR2_Val, TIM2_OCPOLARITY_HIGH);
  TIM2_OC2PreloadConfig(ENABLE);

  /* PWM1 Mode configuration: Channel3 */       
  TIM2_OC3Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE,CCR3_Val, TIM2_OCPOLARITY_HIGH);
  TIM2_OC3PreloadConfig(ENABLE);

  TIM2_ARRPreloadConfig(ENABLE);

  /* TIM2 enable counter */
  TIM2_Cmd(ENABLE);
}
void Delay(uint16_t nCount)
{
  /* Decrement nCount value */
  while (nCount != 0)
  {
    nCount--;
  }
}
Chúc các bạn thanh công!
 

Đính kèm

Tran luong

Trần Đình Lượng, Đt: 0989285187-HCM
#4
À đây em muốn làm cho nó rõ hơn để nhìn thực tế hơn thôi mà!
Chào bác.
Mình muốn tạo 2 xung như hình đính kèm thì liệu sử dụng PWM có làm được không bác nhễ. Lưu ý của em là có dead-time. Xung này em dùng ngắt timer để tạo đấy ah.
Thanks bác nhé.
 

dongmta

Học sinh trung cấp
#5
Anh returnX có thể nói rõ giúp em chạy 7 xung PWM duty là như nào với ạ..Em đọc trong thư viện TIM1 thì có chế độ là PWM1 và PWM2.2 chế độ này khác nhay gì hả các anh
 

ZingTG

Học sinh phổ thông
#6
em muốn viết pwm cho nhiều chân trên stm8s003f3p6 thì làm ssao ah
 

vancuong

Học sinh phổ thông
#8
upload_2017-6-13_14-54-12.png

///////////////////////////////////////////////////////////
Mình nạp code đoạn chương trình trên, chạy thử rồi đo bằng Osilo thì chỉ đo được điện áp đầu ra 5V chứ không thấy được xung nhỉ? Mod hoặc bạn nào giải thích dùm mình với,
Xin cảm ơn!
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Để đáp lại tinh thần chia sẻ một số anh em đã chia sẻ! Mình đưa code về PWM STM8S cho các bạn tham khảo!
Để nhìn rõ hơn về xung PWM mình thêm vào hàm delay! giữa các chu kỳ xung cho nó thể hiện rõ ràng hơn! với xung xuất ra chân PD4!
Với kít thực hành đơn giản cho những bạn muốn thực hành chỉ cần có một bộ nạp ST_LINK V2 giá 150K+một chíp STM8S003(10K) và 2 con tụ gốm 104 và 1 con trở 1k + mạch PCB28 có sẵn tại các cửa hàng bán linh kiện và ráp và hàn vo là OK! sơ đồ bạn có thể nắp ráp theo sơ đồ bên dưới!
Phần code full bên dưới!
Xem đính kèm 48543
HTML:
//-----------------------------------------------------------------------
//
// NGUYEN VAN CONG
// http://ceesgroup.blogspot.com
// kit mini STM8S103
//
//-----------------------------------------------------------------------
#include "stm8s_conf.h"
uint16_t CCR1_Val = 500;
uint16_t CCR2_Val = 250;
uint16_t CCR3_Val = 125;
//uint16_t CCR1_Val_1;
void Delay(uint16_t nCount);
static void TIM2_Config(void);
static void TIM2_PWM1(uint16_t CCR1_Val_2);

/*
         - TIM2_CH1  pin (PD.4)
         - TIM2_CH2  pin (PD.3)
         - TIM2_CH3  pin (PA.3)
   Các TIM2CLK là 2MHz, các Prescaler là 1 nên TIM2 clock truy c?p là 2MHz.

   Các TIM2 f= 2 KHz: TIM2 Frequency = TIM2 clock counter / (ARR + 1)
   TIM2 là 2KHz.


   Các TIM2 CCR1 gia tri dang ky 500, nên TIM2 Channel 2 Kênh 1 tao ra  mot
   tin hieu PWM voi tan so 2KHz và mot chu ky nhiem 50%:
   Chu ky nhiem vu TIM2 Channel1 = [TIM2_CCR1 / (TIM2_ARR + 1)] * 100 = 50%

   Các TIM2 CCR2 gia tri dang ky 375, nên TIM2 Channel 2 Kênh 1 tao ra  mot
   tin hieu PWM voi tan so 2KHz và mot chu ky nhiem 25%:
   Chu ky nhiem vu TIM2 Channel2 = [TIM2_CCR2 / (TIM2_ARR + 1)] * 100 = 25%

   Các TIM2 CCR3 gia tri dang ky 250, nên TIM2 Channel 2 Kênh 1 tao ra  mot
   tin hieu PWM voi tan so 2KHz và mot chu ky nhiem 50%:
   Chu ky nhiem vu TIM2 Channel3 = [TIM2_CCR3 / (TIM2_ARR + 1)] * 100 = 12,5%


*/

void main(void)
{
  /* TIM2 configuration -----------------------------------------*/
  /*TIM2_Config(); */

  while (1)
  {
    TIM2_PWM1(10);
    Delay(0xFFFF);
    TIM2_PWM1(100);
    Delay(0xFFFF);
    TIM2_PWM1(200);
    Delay(0xFFFF);
    TIM2_PWM1(300);
    Delay(0xFFFF);
    TIM2_PWM1(500);
    Delay(0xFFFF);
    TIM2_PWM1(600);
    Delay(0xFFFF);
    TIM2_PWM1(700);
    Delay(0xFFFF);
    TIM2_PWM1(800);
    Delay(0xFFFF);
    TIM2_PWM1(900);
    Delay(0xFFFF);
    //===========================================
     TIM2_PWM1(900);
    Delay(0xFFFF);
     TIM2_PWM1(800);
    Delay(0xFFFF);
     TIM2_PWM1(700);
    Delay(0xFFFF);
     TIM2_PWM1(600);
    Delay(0xFFFF);
     TIM2_PWM1(500);
    Delay(0xFFFF);
     TIM2_PWM1(400);
    Delay(0xFFFF);
     TIM2_PWM1(300);
    Delay(0xFFFF);
     TIM2_PWM1(200);
    Delay(0xFFFF);
     TIM2_PWM1(100);
    Delay(0xFFFF);
     TIM2_PWM1(10);
    Delay(0xFFFF);
  }
}
static void TIM2_PWM1(uint16_t CCR1_Val_2)
{
  /* Time base configuration */
  TIM2_TimeBaseInit(TIM2_PRESCALER_1, 999);
  /* PWM1 Mode configuration: Channel1 */
  TIM2_OC1Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE,CCR1_Val_2, TIM2_OCPOLARITY_HIGH);
  TIM2_OC1PreloadConfig(ENABLE);
  TIM2_ARRPreloadConfig(ENABLE);

  /* TIM2 enable counter */
  TIM2_Cmd(ENABLE);
}
static void TIM2_Config(void)
{
  /* Time base configuration */
  TIM2_TimeBaseInit(TIM2_PRESCALER_1, 999);

  /* PWM1 Mode configuration: Channel1 */
  TIM2_OC1Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE,CCR1_Val, TIM2_OCPOLARITY_HIGH);
  TIM2_OC1PreloadConfig(ENABLE);

  /* PWM1 Mode configuration: Channel2 */
  TIM2_OC2Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE,CCR2_Val, TIM2_OCPOLARITY_HIGH);
  TIM2_OC2PreloadConfig(ENABLE);

  /* PWM1 Mode configuration: Channel3 */      
  TIM2_OC3Init(TIM2_OCMODE_PWM1, TIM2_OUTPUTSTATE_ENABLE,CCR3_Val, TIM2_OCPOLARITY_HIGH);
  TIM2_OC3PreloadConfig(ENABLE);

  TIM2_ARRPreloadConfig(ENABLE);

  /* TIM2 enable counter */
  TIM2_Cmd(ENABLE);
}
void Delay(uint16_t nCount)
{
  /* Decrement nCount value */
  while (nCount != 0)
  {
    nCount--;
  }
}
Chúc các bạn thanh công!
upload_2017-6-13_14-54-12.png
 

Quảng cáo Google