[C17] Đề thi cuối khóa

nguyễn đình huân

Cố Vấn CLB
Hi các em:1cool_byebye:,
Sau một thời gian học lớp C17, chúng ta sẽ có một đề thi cuối khóa để được làm thành viên chính thức của CLB. Với nhiều bạn thì đây cũng là cơ hội đầu tiên để mình làm một project thực tế.

I. Nội dung: Thiết kế một thiết bị wearable thông minh: smartwatch, thiết bị theo dõi sức khỏe, áo quần thông minh hay bất kì thứ gì đó các em có thể nghĩ ra.

II. Yêu cầu:
- Bắt buộc: :6cool_boss:

  • Sản phẩm phải có gì đó gọi là "thông minh" và thiết kế gọn đẹp để mang được trên người (tất nhiên rồi :5cool_sweat:).
  • Sản phẩm phải có đủ 2 phần: hardware + firmware, tùy vào chức năng có thể thêm phần Software trên máy tính hay điện thoại ...
  • Sử dụng vi điều khiển MSP430 là vi điều khiển chính (không nhất thiết sử dụng dòng G2553).
- Tiêu chí đánh giá: :D
  • Sản phẩm có ý tưởng sáng tạo và hoàn thiện.
  • Sử dụng được nhiều module đã học (không cần đủ hết các module): GPIO, Timer, ADC, các mode tiết kiệm năng lượng, ...
  • Sử dụng ít nhất một cảm biến.
  • Giao diện người dùng (nếu có) thân thiện, dễ dùng.
  • Code rõ ràng, trong sáng.
III. Hình thức thi: Tối đa 2 người trong 1 nhóm.
Để chuẩn bị cho báo cáo, các em đăng ký đề tài tại đây.
Hạn chót đăng ký: 23h59m59s ngày 11/3/2017

IV. Thời gian báo cáo
:

- Chúng ta sẽ báo cáo ngày Chủ nhật 18/3/2017. Địa điểm cụ thể sẽ được thông báo sau.

Chúc các em hoàn thành tốt sản phẩm! :)
 

nguyễn đình huân

Cố Vấn CLB
Các bạn có thắc mắc hoặc cần hướng dẫn để thực hiện đề tài của mình thì có thể post lên forum hoặc đến 304B1 lúc 2h chiều Chủ nhật ngày 11/3 để được tư vấn nhé.
 

Hồ Thanh Phong

Thành Viên PIF
Em dùng cái cảm biến nhịp tim dạng quang
, cấp nguồn 3v3 vào rồi đo thử ngõ ra bằng vom thấy có lúc nó nhảy lên 6V . Không biết em đo vậy là có đúng không hay thực ra áp ngõ ra nó không tới đó. Cần lắm một lời hướng dẫn để em dám cắm nó vào chân con vđk :D
 

Hồ Thanh Phong

Thành Viên PIF
Code:
int heart_beat=0; nhip tim
long int f=0; // f dem so lan tran timer
long int capture_value=0; tong so lan dem cua timer giua 2 lan canh len
void config_capture(void)
{
        P2SEL |= BIT1;
        P2SEL2 &=~BIT1;
                                 
        P2DIR &=~BIT1;                 

        P2IE |=BIT1;
        P2IFG &=~ BIT1;

        // P2REN |= BIT1;
        // P2OUT |= BIT1;
        WDTCTL = WDTPW + WDTHOLD;             
        TA1CTL = TASSEL_2 + MC_2 + TAIE;               
        TA1CCTL1 |= CM_1 +CCIS_0+CAP+CCIE;       
                                               
        TA1R =0;


        _BIS_SR(GIE);           
}

#pragma vector=TIMER1_A1_VECTOR
__interrupt void TA1IV_Interrupt (void)
{
    switch(TA1IV)
    {
        case 10 :          //tran timer
        {
            count_overflow(&f);
            break;
        }
        case 2 :
        {
            count_heart_beat(&capture_value,&f,&heart_beat);
            break;

        }
    }

}
void count_heart_beat(long int *capture_value, long int *f, int *heart_beat)   
{
                long int z;

               *capture_value = TACCR1+*f*65536;
               TA1R = 0;
               *f=0;
               z = 60/(*capture_value*1000000);
               *heart_beat = z;

}
void count_overflow(long int *f)
{
    *f=*f+1;
}
[/QUOTE]
 

Hồ Thanh Phong

Thành Viên PIF
Anh xem giúp em cái code với, em dùng capture timer đo thời gian giữa 2 cạnh lên, nó toàn hiển thị ra -1 mà em không biết nó sai chỗ nào nữa @@ ngõ vão em đưa vào P2.1, xài cảm biến thì nó không ra, còn dùng áp 3v3 kích vô thí lại ra -1
Với lại ngõ ra cảm biến dạng analog thì đọc cạnh lên vậy được không anh.
 

Hồ Thanh Phong

Thành Viên PIF
Mọi người giup em với, còn vài ngày nữa là báo cáo rồi @@
Em dùng ADC đọc ngõ ra từ cảm biến rồi tạo xung vuông ra trên P1.5, đưa xung vuông vào P1.2 dùng capture đo thời gian 2 cạnh lên mà cái kết quả em không thấy liên quan với mấy cái biến em đặt @@
Code:
uint16_t adc_result;
unsigned int heart_beat=0;
unsigned int f=0; // f dem so lan tran timer
unsigned long int capture_value=0;
void main()
{   
       WDTCTL = WDTPW | WDTHOLD;
       DCOCTL = CALDCO_1MHZ;
       BCSCTL1 = CALBC1_1MHZ;
       P1SEL &=~ BIT5;
       P1SEL2 &=~ BIT5;
       P1DIR |= BIT5;
       config_capture();
       config_ADC10();
       LCD_Init();

       LCD_Clear();
       LCD_Home();
     
       ADC10CTL0 |= ENC + ADC10SC;
               _bis_SR_register(LPM0_bits + GIE);
       while(1)
       {
           ADC10CTL0 |= ENC + ADC10SC;
           _bis_SR_register(LPM0_bits + GIE);
              LCD_Goto(2,5);
              LCD_PrintDecimal(heart_beat,5);
              LCD_Goto(1,5);
              LCD_PrintDecimal(adc_result,5);
             

           _delay_cycles(10);
       }
}
void config_capture(void)
{
        P1SEL |= BIT2;
        P1SEL2 &=~BIT2;

        P1DIR &=~BIT2;

        P1IE |=BIT2;
        P1IFG &=~ BIT2;

        WDTCTL = WDTPW + WDTHOLD;
        TA0CTL = TASSEL_2 + MC_2 + TAIE;
        TA0CCTL1 |= CM_1 +CCIS_0+CAP+CCIE;
        TA0R =0;
        _BIS_SR(GIE);
}
#pragma vector=TIMER0_A1_VECTOR
__interrupt void TA0IV_Interrupt (void)
{
    switch(TA0IV)
    {
        case 10 :          //tran timer
        {
            count_overflow(&f);
            break;
        }
        case 2 :
        {
            count_heart_beat(&capture_value,&f,&heart_beat);
            break;

        }
    }

}
void config_ADC10(void)
{
    ADC10CTL0 = SREF_0 + ADC10SHT_1 + ADC10ON +ADC10IE;
    ADC10CTL1 = INCH_0 + ADC10DIV_1 + ADC10SSEL_3;
    ADC10AE0 |= BIT0;
}
#pragma vector = ADC10_VECTOR
__interrupt void ADC10_Interrupt(void)
{
    adc_result = ADC10MEM;
    if(adc_result>800)
              {
                  P1OUT |= BIT5;
              }
              else
                  P1OUT &=~ BIT5;
    _bic_SR_register_on_exit(LPM0_bits);
}
void count_heart_beat(unsigned long int *capture_value,unsigned int *f,unsigned int *heart_beat)
{           
               *capture_value = TACCR1+*f*65536;
               TA0R = 0;
               *f=0;
               *heart_beat= 60/(*capture_value/1000000);

}
void count_overflow(unsigned int *f)
{
    *f=*f+1;
}
 

nguyễn đình huân

Cố Vấn CLB
Chào em, về ý tưởng thì anh thấy có vài vấn đề:
1) Giá trị ADC em đọc được khi đi qua 800 sẽ có dao động quanh giá trị ngưỡng này (do nhiễu) nên độ rung xung trong thời gian này có thể ngắn hơn xung nhịp tim trong thực tế. Khắc phục: sau khi kiểm tra giá trị ADC vượt qua 800, em có thể dừng không lấy ADC trong 5ms chẳng hạn để bỏ qua thời gian ADC dao động quanh mức ngưỡng (tương tự chống rung phím).
2) Anh thấy em đang lấy ADC sau mỗi 10 cycles, như vậy là khá dư thừa và không tiết kiệm năng lượng. Em có thể giảm thời gian lấy mẫu lại.
3) Em có thể đọc ADC rồi tính thời gian xung nhịp tim từ giá trị TA0R luôn, không cần phải output ra chân GPIO rồi capture.
 

Hồ Thanh Phong

Thành Viên PIF
Em không hình dung tính nhịp tim trực tiếp từ TA0R ra sao nên em mới dùng capture :v mà em đã fix được lỗi rồi, nó ra kết quả đúng quy trình với em nghĩ code đã đúng luôn rồi anh :v cảm ơn anh nha :1cool_byebye:
 
Top