[C8] Code mẫu Timer PWM-Capture

Manhdd

Cố Vấn CLB
Staff member
<< Folder tổng hợp tài liệu cho C8 >> (nội dung update đến 14-05-2013)
mirror link: https://www.dropbox.com/sh/55s1lfi8wgyd2fe/exzxWn30SU


Code mẫu của bạn zbloodelfz cho các bạn nào còn chưa chạy thành công:
+ Xuất PWM duty 10/100 tại chân TA0.1 (P1.2, P1.6)
Code:
/*
* main.c
*
*  Created on: May 5, 2013
*      Author: BloodElf
*/
#include <msp430g2553.h>
 
 
 
void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;    //Tat watchdog timer
 
 
    TA0CTL = TASSEL_2 +MC_1;    //Timer Clock = SMCLK = 1Mhz, Mode Up
    TA0CCTL1 = OUTMOD_3;        // CCR1 : xuat xung theo mode 3
 
    P1SEL |= BIT2+BIT6;            //Port 1.2 và 1.6 cung co the xung theo CCR1(TA0.1)
    P1SEL2 &=~(BIT2+BIT6);        // Xem data sheet de biet pin nao co chuc nang nay
 
    TA0CCR0 = 100;                //Chon CCR0 lam chu ky và CCR1 la nguong de thay
    TA0CCR1=10;                    //doi gia tri OUT theo mode
 
 
    _BIS_SR(LPM0_bits + GIE);    //Low-power mode
}
+ Capture thời gian kích cạnh lên tại chân P2.1
Code:
/*
* main.c
*
*  Created on: May 12, 2013
*      Author: BloodElf
*/
#include <msp430.h>
 
int cap_value;
void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;                //Tat watchdogtimer
    TA1CTL = TASSEL_2 + MC_2;                //Chon clocktimer = 1Mhz, Cont.up mode
    TA1CCTL1 |= CM_1+CCIS_0+CAP+CCIE;        // Config CCR1 la capture : kich canh len
                                            //Channel A, capture mode, enable ngat
    TA1R =0;
 
    P2SEL |= BIT1;                            //Config pin thanh chan capture theo ccr1
    P2SEL2 &=~BIT1;                            //Xem datasheet de biet pin nao co kha nang
    P2DIR &=~BIT1;                            //capture
 
    _BIS_SR(LPM0_bits + GIE);                //Low-power mode + enable ngat toan cuc
}
#pragma vector=TIMER1_A1_VECTOR
__interrupt void TA1IV_Interrupt (void)
{
    {
    case TA1IV_TACCR1:
    {
        cap_value = TA1CCR1;                //Lay gia tri capture vo bien cap_value
        TA1R =0;                            //Reset bo dem timer
        //CCR1+=31250;
        break;
    }
    case TA1IV_TA1CCR2:
    {
    }
    case TA1IV_TAIFG :
    {
    }
    }
 
}
Bài tập phát triển code PWM:
- Đưa thử xung PWM vào 2 ngõ vào của module BJT, thay đổi duty và quan sát (chú ý để buzzer hoạt động cần cấp nguồn 5V cho main)
- Dùng cả CCR1 và CCR2 của TimerA0 để tạo 2 xung PWM cho 2 LED.
- Thay thế TimerA0 bằng TimerA1 khi xuất PWM.
- Dùng TimerA0 để xuất PWM trên LED, TimerA1 tăng giảm duty theo chu kỳ.
- Tạo 3 xung PWM cấp cho Led 3 màu, làm thay đổi màu sắc tùy ý theo bảng màu R-G-B. Led 3 màu thường bán 3k/con tại tiệm Led 158LTK; gồm 4 chân theo thứ tự: R-Anot-G-B, Anot là chân dài nhất. Có thể kết hợp TimerA0 và TimerA1 tạo 3 xung PWM; hoặc có thể chỉ dùng 1 TimerA (Max duty khi tràn Timer, 3 duty ứng với CCR0-1-2).
---
 

dangkhoa913

Trứng gà
cho e hỏi tần cung cấp cho CCP1 là bao nhiêu để e có thể đọc được tính hiệu động cơ trả về ,vì nếu tần số nhanh quá thì MCU ko thực hiện được chuyện gì khác ngoài chuyện ngắt CCP
 

zbloodelfz

Cố Vấn CLB
Staff member
Hi dangkha913,
Thế thì em phải tính xem tốc độ xung trả về tối đa của động cơ là bao nhiêu mà cho tần số timer thích hợp. Vd: DCMotor 2000 xung/vòng, em muốn điều khiển tối đa 3000 vòng/phút ~ 50 vòng/s ~ 100000 xung/s ~ delta T giữa 2 xung 10us, trong khi tần số MCU mặc định là 1us => vậy là vẫn đủ đáp ứng cho một số lệnh khác. Nếu các công việc khác tốn nhiều thơi gian hơn thì em nên xem xét tăng tần số MCU lên
 
Top