반응형

풋프린트 선정

1.트랜지스터(npn,pnp,JFET 등): TO92
2.다이오드(제너 포함):DO35
3.IC(8,14,16핀짜리): DIP(핀갯수)_3
EX)8핀 IC=DIP8_3
4.정전압 IC: TO220AB
5.저항,R: RES400
6.가변저항: RESADJ
7.콘텐서(극성없음/있음):CAPCK05/CAP196
8.LED: CAP196(극성있는 콘데서와 같다.)
9.CON2/스위치(2핀짜리): JUMPER2
10.CON(3,4,5 등): JUMPER(3,4,5)


[출처] 각 부품별 풋프린트값 알아보기|작성자 뿌이이이잉



전자캐드 기능사 실기 참고 링크


https://m.blog.naver.com/PostView.nhn?blogId=junyoung8934&logNo=220393220042&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F


OrCAD 16.6 이용하여 전자캐드 기능사 실기 평가와 유사한 형태의 회로 설계 진행



그리고자 하는 opamp 기본 구동 회로



- 진행 순서

1) Project 만들기

OrCAD Capture 실행 -> 'File' -> 'New' -> 'Project...' 선택



'Name' -> 생성할 프로젝트명 입력,

'Create a New Project Using' -> 'Schematic' 선택,

'Location' -> 생성할 프로젝트 경로 입력 -> 'OK' 선택


2) 환경 설정

'Options' -> 'Schematic Page Properties...' 선택



'Units' -> 'Millimeters' 선택,

'New page Size' -> 'A4' -> '확인' 선택

 

3) Title Block 작성

도면 우측 하단의 '<Title>' 우클릭 -> 'Edit Properties...' 선택



'Value:' -> 제목 입력 ,

'Font' -> 'Change' 선택
 



'크기' 수정 -> '확인' 선택
 



'Document Number', 'Rev' 위와 동일하게 내용 입력 및 수정 -> 메뉴바 'Snap To grid' 선택



'Title', 'Document Number', 'Rev' 드래그하여 위치 이동 -> 메뉴바 'Snap To Grid' 선택하여 원래 상태로 돌림

 


4) 부품 배치

'Place' -> 'Part...' 선택



우측의 'Place Part' -> 'Libraries:' -> 'Add Library' 선택



'library' 폴더내의 전 폴더 및 파일 선택 -> '열기' 선택
 



'Place Part' -> 'Part'에서 원하는 부품명 입력



도면에 부품 위치 시킴



'Place' -> 'Power...' 선택하여 전원 추가



'Name' -> 원하는 전원 value 입력 -> 'OK' 선택
 



'Place' -> 'Ground...' 선택



'GND' 선택 -> 'OK' 선택
 



핀 수정 위해 'LM741' 우클릭 -> 'Edit Part' 선택



수정하기 전의 핀 배치



4번, 7번 핀 드래그하여 위치 변경



'*.DSN' 탭 우클릭 -> 'Close' 선택



'Update All' 선택

 

5) 배선 작업

LM741의 패키지 형태, 본 회로에서 1, 5번핀 기능은 사용하지 않아 이를 처리해줌

(8번 핀의 NC는 이후 Footprint 과정에서 작업)
 

'Place' -> 'No Connect' 선택



LM741의 1번, 5번 핀 선택하여 아래와 같이 작업



'Place' -> 'Net Alias...' 선택



'Alias:' -> net 이름 입력 -> 'OK' 선택
 



아래와 같이 연결하고자 하는 net 위에 클릭



'Place' -> 'Hierarchical Port...' 선택



'Symbol:' -> 'PORTLEFT-R' 선택 -> 'Name' -> port 이름 입력 -> 'OK' 선택 -> net 위에 클릭
 



위와 동일하게 'PORTLEFT-L' 선택 -> 'NAME' -> port 이름 입력 -> 'OK' 선택 -> net 위에 클릭
 



아래와 같이 작업



'*.opj' 탭 -> '*.dsn' 선택 -> 'Tools' -> 'Annotate...' 선택



'Action' -> 'Reset part references to "?" 선택 -> '확인' 선택
 



아래와 같이 reference "?"로 초기화



적절하게 reference 지정

 


6) Footprint 작업

'*.opj' 탭 -> '*.dsn' 우클릭 -> 'Edit Object Properties' 선택




 PCB Footprint

 Part 

 DIP8_3

 LM741, LF355, LF356, NE555

 DIP14_3

 74LS90, 4011, 4013, 74LS04

 DIP16_3

 4538

 CON2

 JUMPER2

 CON3

 JUMPER3

 CON4

 JUMPER4

 DO41

 DIODE, DIODE ZENER

 RES400

 RESISTOR

 RESADJ

 RESISTOR VAR 

 CAPCK05

 CAP NP

 CAP196

 CAP POL, LED

 TO92

 NPN ECB, JFET N SGD

 TO220AB

 LM7812, LM7912



'PCB Footprint' 열의 적절한 내용 입력 -> 'New Property...' 선택



'Name' -> 'NC' 입력 -> 'OK' 선택
 



풋프린트상 연결하지 않는 핀 번호 'NC' 열에 입력

 


7) 설계 규칙 검사

'*.opj' 탭 -> '*.dsn' 선택 -> 'Tools' -> 'Design Rules Check...' 선택



'Design Rules' -> 'View Output' 선택 -> '확인' 선택
 



에러 확인



'*.opj' 탭 -> '*.dsn' 선택 -> 'Tools' -> 'Create Netlist...' 선택



'Create or Update PCB Editor Board (Netrev)' 선택,

'Options' -> 'Board Launching Option' -> 'Open Board in OrCAD PCB Editor' 선택
 



생성된 파일 확인




반응형

'Study > 전자캐드기능사' 카테고리의 다른 글

전자캐드기능사 풋프린트 Artwork  (0) 2021.01.25
반응형

인터넷에 떠도는 C# 메모장 프로그램이다...

 

생각보다 간단하네...?

 

MemoEx.zip
0.78MB

 

반응형

'Study > C#' 카테고리의 다른 글

C# - 활쏘기 게임  (0) 2018.08.31
C# - 닷지 게임 만들기 결과  (2) 2018.08.31
C# - 닷지 게임 만들기  (0) 2018.08.30
C# - 비행기 자유롭게 움직이기  (0) 2018.08.30
C# - 공튀기기 (particles.js)  (0) 2018.08.30
반응형

/* Atmega128 mtx128-s2보드와 ds3231 rtc모듈, char LCD wc0802C 제품으로 시계를 만들었다.

기능들을 함수로 빼놓았기 때문에 나중에 회로도와 핀맵만 맞는다면 사용할 수 있다.

회로도 그리기 너무 귀찮다아아

*/


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
/*
 * char_lcd.c
 *
 * Created: 2019-01-21 오후 4:25:21
 * Author : admin
 */
 
#include <avr/io.h>
#define F_CPU 16000000
#include <util/delay.h>
#include <stdio.h>
 
#define PORT_DATA PORTD
#define PORT_CONTROL PORTC
#define DDR_DATA DDRD
#define DDR_CONTROL DDRC
 
#define RS_PIN 0
#define RW_PIN 1
#define E_PIN 2
 
#define COMMAND_CLEAR_DISPLAY 0x01
#define COMMAND_8_BIT_MODE 0x38
#define COMMAND_4_BIT_MODE 0x28
 
#define COMMAND_DISPLAY_ON_OFF_BIT 2
#define COMMAND_CURSOR_ON_OFF_BIT 1
#define COMMAND_BLINK_ON_OFF_BIT 0
 
extern uint8_t MODE;
 
void LCD_Pulse_enable();
void LCD_write_data(uint8_t data);
void LCD_write_command(uint8_t command);
void LCD_clear();
void LCD_init();
void LCD_write_string(char *string);
void LCD_goto_XY(uint8_t row, uint8_t col);
//////////////////////////////////////////////////////////
 
void LCD_Pulse_enable(){
    PORT_CONTROL |= (1<<E_PIN);
    _delay_us(1);
    PORT_CONTROL &= ~(1<<E_PIN);
    _delay_us(1);
}
void LCD_write_data(uint8_t data){
    PORT_CONTROL |= (1<<RS_PIN);
    if(MODE == 8){
        PORT_DATA = data;
        LCD_Pulse_enable();
    }
    else{
        PORT_DATA = data& 0xf0;
        LCD_Pulse_enable();
        PORT_DATA = (data<<4)&0xf0;
        LCD_Pulse_enable();
    }
    _delay_ms(2);
}
void LCD_write_command(uint8_t command){
    PORT_CONTROL&= ~(1<<RS_PIN);
    
    if(MODE ==8){
        PORT_DATA =command;
        LCD_Pulse_enable();
    }
    else {
        PORT_DATA = command & 0xf0;
        LCD_Pulse_enable();
        PORT_DATA = (command <<4& 0xf0;
        LCD_Pulse_enable();
    }
    _delay_ms(2);
}
void LCD_clear(){
    LCD_write_command(COMMAND_CLEAR_DISPLAY);
    _delay_ms(2);
}
void LCD_init(){
    _delay_ms(50);
    if(MODE == 8){
        DDR_DATA =0xff;
    }
    else DDR_DATA |= 0xf0;
    PORT_DATA = 0x00;
    DDR_CONTROL |= (1<<RS_PIN)|(1<<RW_PIN)|(1<<E_PIN);
    
    PORT_CONTROL &= ~(1<<RW_PIN);
    
    if(MODE == 8){
        LCD_write_command(COMMAND_8_BIT_MODE);
    }
    else{
        LCD_write_command(0x02);
        LCD_write_command(COMMAND_4_BIT_MODE);
    }
    
    uint8_t command = 0x08|(1<<COMMAND_DISPLAY_ON_OFF_BIT);
    LCD_write_command(command);
    
    LCD_clear();
    
    LCD_write_command(0x06);
}
void LCD_write_string(char *string){
    uint8_t i;
    for(i=0;string[i];i++){
        LCD_write_data(string[i]);
    }
}
void LCD_goto_XY(uint8_t row, uint8_t col){
    col %=16;
    row%=2;
    
    uint8_t address = (0x40*row)+col;
    uint8_t command =0x80+address;
    
    LCD_write_command(command);
}
 
uint8_t MODE = 4;
 
#define I2C_SCL PD0
#define I2C_SDA PD1
 
unsigned int sec, min, hour, day, month, year, week;
 
 
void uartInit(long buadrate)
{
    UCSR0A = 0x00// ready flag clear
    UCSR0B = 0x18// rx, tx enable
    UCSR0C = 0x06// tx data len : 8bit
    UBRR0H = 0;
    switch(buadrate){
        case 115200:
        UBRR0L = 8;
        break;
        
        case 57600:
        UBRR0L = 16;
        break;
        
        case 38400:
        UBRR0L = 25;
        break;
        
        case 19200:
        UBRR0L = 51;
        break;
        
        case 14400:
        UBRR0L = 68;
        break;
        
        case 9600:
        UBRR0L = 103;
        break;
        
        // Default 19200
        default:
        UBRR0L = 51;
        break;
    }
}
void send_data(unsigned char data)
{
    while(!(UCSR0A&0x20)); // 송신데이터를 받을 준비가 될때까지 대기
    UDR0 = data;
}
void SendLine(char *string)
{
    while(*string != '\0')
    {
        send_data(*string);
        string++;
    }
}
 
void init_i2c(){
    DDRD |= (1<<I2C_SCL);
    DDRD |= (1<<I2C_SDA);
    
    TWBR = 32// 200khz
}
void i2c_start(){
    TWCR = (1<< TWINT)|(1<<TWSTA)|(1<<TWEN);
    while(!(TWCR&(1<<TWINT))); // 시작완료 대기
}
void i2c_transmit(uint8_t data){
    TWDR = data;
    TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);
    while(!(TWCR&(1<<TWINT))); // 전송완료 대기
}
uint8_t i2c_receive_ACK(){
    TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);
    while(!(TWCR&(1<<TWINT)));
    return TWDR;
}
uint8_t i2c_receive_NACK(){
    TWCR = (1<<TWINT)|(1<<TWEN);
    while(!(TWCR&(1<<TWINT))); // 수신완료 대기
    return TWDR;
}
void i2c_stop(){
    TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN);
    _delay_us(100);
}
 
uint8_t bcd_to_decimal(uint8_t bcd){
    return (bcd>>4*10 +(bcd&0x0f);
}
uint8_t decimal_to_bcd(uint8_t decimal){
    return (((decimal/10)<<4)|(decimal%10));
}
 
int main(void)
{    
    LCD_init();
    char lcd_buff[100];
    init_i2c();
    
    sec = min = hour = day = month = year = week= 0;
    char str[1000];
    
    uint8_t address = 0x68;
    // 초 분 시 요일 일 월 연
    uint8_t date[] = {0,10,12,2,10,10,19};
    
    
    i2c_start();
    i2c_transmit(address <<1);
    i2c_transmit(0);
    for (int i =0; i<7;i++){
        i2c_transmit(decimal_to_bcd(date[i]));
    }
    i2c_stop();
    DDRA = 0xff;
    PORTA = 0x00;
    
    while (1
    {
        i2c_start();
        i2c_transmit(address <<1);
        i2c_transmit(0);
        i2c_stop();
        
        i2c_start();
        i2c_transmit((address<<1)+1);
        
        sec = bcd_to_decimal(i2c_receive_ACK());
        min = bcd_to_decimal(i2c_receive_ACK());
        hour = bcd_to_decimal(i2c_receive_ACK());
        week = bcd_to_decimal(i2c_receive_ACK());
        day = bcd_to_decimal(i2c_receive_ACK());
        month = bcd_to_decimal(i2c_receive_ACK());
        year = bcd_to_decimal(i2c_receive_NACK());
        
        i2c_stop();
        
        LCD_goto_XY(0,0);
        sprintf(lcd_buff,"%d/%d/%d",year,month,day);
        LCD_write_string(lcd_buff);
        LCD_goto_XY(1,0);
        sprintf(str,"%d:%d:%d",hour,min,sec);
        LCD_write_string(str);
        
        /* LCD example
        LCD_goto_XY(1,1);
        LCD_write_string("hi");
        */
        
        //sprintf(lcd_buff,"%d/%d/%d",year,month,day);
        //sprintf (str, "%d sec, %d min, %d hour, %d week, %d day, %d month, %d year\r\n",sec,min,hour,week,day,month,year);
        //sprintf(str,"%d sec\r\n",sec);
        
    }
    return 0;
}
cs


반응형
반응형

Atmega8a 

8MHz Ext.OSC



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/*
 * Study_Atmega8A.c
 *
 * Created: 2018-12-18 오후 10:30:25
 * Author : HeungSik
 */ 
 
#include <avr/io.h>
#define F_CPU 8000000
#define FOSC 8000000
#include <util/delay.h>
#define BAUD 9600
#define MYUBRR FOSC/16/BAUD-1
 
void init_serial();
void USART_Transmit(unsigned char data);
unsigned char USART_Receive( void );
 
void init_serial(unsigned int ubrr){
    UBRRH = (unsigned char)(ubrr >>8);
    UBRRL = (unsigned char)ubrr;
    //UBRRL = 25;
    /* Enable receiver and transmitter */
    UCSRB = (1<<RXEN)|(1<<TXEN);
    /* Set frame format: 8data, 2stop bit */
    UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
}
void USART_Transmit( unsigned char data )
{
    /* Wait for empty transmit buffer */
    while ( !( UCSRA & (1<<UDRE)) )
    ;
    /* Put data into buffer, sends the data */
    UDR = data;
}
unsigned char USART_Receive( void )
{
    /* Wait for data to be received */
    while ( !(UCSRA & (1<<RXC)) )
    ;
    /* Get and return received data from buffer */
    return UDR;
}
void Transmit_Line(char *string){
    int i =0;
    while (*string != 0x00)
    {
        USART_Transmit(*string);
        i++;
    }
}
int main(void)
{
    
    init_serial(MYUBRR);
    
    while (1
    {
        USART_Transmit('a');
        
        _delay_ms(50);
    }
}
 
 
cs


다음은 BLE모듈 사용하여 LED 제어하기


반응형
반응형

1.jpg


자세히 보면 inch 와 mm 가 어느순간 뒤짚힌 듯한 느낌이 듭니다.

인치로 0603 이라고 말하면 mm 로는 1608 인데. mm 로 0603 이라고 말하면 inch 로는 0201 이 되기 때문에

표기를 할때 구분을 잘 해야 합니다.

 

뭐, 일반적으로 mm 사이즈 기준 1005,1608,2012 세가지를 주로  쓰기 때문에 

아직 전달상의 문제로 사이즈가 다른 chip 이 박힌적은 없지만, 만약 아주 소형 사이즈를 사용 하게 

될 경우 주의 해야 합니다.



반응형

'Study > 하드웨어' 카테고리의 다른 글

led 저항값 계산하기  (0) 2019.01.09
Noise 대책  (0) 2019.01.07
RC low-pass filter Design  (0) 2019.01.07
반응형

최소 구동 전압과 최대 구동 전압

LED는 최소 구동전압과 최대 구동전압이 있다. 최소 구동 전압보다 낮으면 흐리게 빛이 나고 최대 구동 전압보다 높으면 LED가 파손된다. 이를 표로 나타내면 아래와 같다. (출처)

색상구 분최소전압최대전압전류(일반)전류(최대)
Red1.8V2.3V20 ㎃50 ㎃
Orange2.0V2.3V30 ㎃50 ㎃
Real Yellow2.0V2.8V20 ㎃50 ㎃
emerald Green1.8V2.3V20 ㎃50 ㎃
Real Green3.0V3.6V20 ㎃50 ㎃
sky Blue3.4V3.8V20 ㎃50 ㎃
Real Blue3.4V3.8V20 ㎃50 ㎃
Pink3.4V3.8V20 ㎃50 ㎃
백○White3.4V4.0V20 ㎃50 ㎃

물론 정확한 스팩은 LED의 데이터 시트를 살펴봐야겠지만 데이터 시트가 없는 경우 위의 표를 참고한다.

따라서 LED를 작동할 때는 적당한 저항을 배치해서 LED에 가해지는 전압을 적절하게 조절해야 한다. 이를 위한 방법은 여러가지가 있지만 간단한 계산을 통해서 알아내는 방법을 살펴보자.

공식

(입력전압 -  LED를 켜기 위한 최소전압 )/전류 =  저항값

간단한 계산

예를들어서 적색 LED를 사용하고 입력전압이 5V라면 아래와 같이 계산하면 된다.

1000mA는 1A이다. 따라서 20mA는 20/1000A 즉 0.02A이다. (계산기)

(5V(입력전압) - 1.8V(LED 최소전압))/0.02A(전류) = 160옴

즉 160옴 보다 큰 저항을 사용하면 된다.

LED를 직렬로 연결했을 때

적색 LED 2개를 직렬로 연결했을 때 계산하는 법을 알아보자.

(5V - (1.8V X 2개)) / 0.02A = 70옴

반응형

'Study > 하드웨어' 카테고리의 다른 글

칩 저항 Size 표  (0) 2019.01.09
Noise 대책  (0) 2019.01.07
RC low-pass filter Design  (0) 2019.01.07
반응형
#include <stdlib.h>    // qsort 함수가 선언된 헤더 파일


int compare(const void *a, const void *b)    // 오름차순 비교 함수 구현
{
    int num1 = *(int *)a;    // void 포인터를 int 포인터로 변환한 뒤 역참조하여 값을 가져옴
    int num2 = *(int *)b;    // void 포인터를 int 포인터로 변환한 뒤 역참조하여 값을 가져옴

    if (num1 < num2)    // a가 b보다 작을 때는
        return -1;      // -1 반환
    
    if (num1 > num2)    // a가 b보다 클 때는
        return 1;       // 1 반환
    
    return 0;    // a와 b가 같을 때는 0 반환
}

int main()
{
    int numArr[10] = { 8, 4, 2, 5, 3, 7, 10, 1, 6, 9 };    // 정렬되지 않은 배열

    // 정렬할 배열, 요소 개수, 요소 크기, 비교 함수를 넣어줌
    qsort(numArr, sizeof(numArr) / sizeof(int), sizeof(int), compare);

    for (int i = 0; i < 10; i++)
    {
        printf("%d ", numArr[i]);    // 1 2 3 4 5 6 7 8 9 10
    }

    printf("\n");

    return 0;
}



// 내림차순


int compare(const void *a, const void *b)    // 내림차순 비교 함수 구현
{
    int num1 = *(int *)a;    // void 포인터를 int 포인터로 변환한 뒤 역참조하여 값을 가져옴
    int num2 = *(int *)b;    // void 포인터를 int 포인터로 변환한 뒤 역참조하여 값을 가져옴

    if (num1 > num2)    // a가 b보다 클 때는
        return -1;      // -1 반환
    
    if (num1 < num2)    // a가 b보다 작을 때는
        return 1;       // 1 반환
    
    return 0;           // a와 b가 같을 때는 0 반환
}



// 좀더 간단하게 구현 할 경우


int compare(const void *a, const void *b)
{
    return *(int *)a - *(int *)b;    // 오름차순
}
int compare(const void *a, const void *b)
{
    return *(int *)b - *(int *)a;    // 내림차순
}


반응형

'Study > C' 카테고리의 다른 글

Sprintf에 예제와 사용 예  (0) 2019.01.04
itoa, atoi 함수에 대하여  (0) 2019.01.04
C언어 - 자연수의 조합  (0) 2018.09.14
C언어 - 자판기  (0) 2018.09.14
C언어 - 포인터 이해  (0) 2018.09.07
반응형

https://www.google.com/search?q=APDS+100+tips&oq=APDS+100+tips&aqs=chrome..69i57j35i39.8554j0j8&sourceid=chrome&ie=UTF-8


https://www.analog.com/media/en/technical-documentation/application-notes/AN-1109.pdf


http://facta.junis.ni.ac.rs/eae/fu2k12/fu04.pdf

반응형

'Study > 하드웨어' 카테고리의 다른 글

칩 저항 Size 표  (0) 2019.01.09
led 저항값 계산하기  (0) 2019.01.09
RC low-pass filter Design  (0) 2019.01.07
반응형

https://m.blog.naver.com/PostView.nhn?blogId=ga1267&logNo=220111519302&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F


https://webnautes.tistory.com/991

반응형
반응형

ADC 관련 프로젝트를 하던중, 


ADC값의 노이즈가 검출이 되어, RC 필터를 이용하여 노이즈를 감쇄 시켰다.


RC 필터의 선정은 해당 링크에서 참고.


http://sim.okawa-denshi.jp/en/CRlowkeisan.htm


참고 링크

반응형

'Study > 하드웨어' 카테고리의 다른 글

칩 저항 Size 표  (0) 2019.01.09
led 저항값 계산하기  (0) 2019.01.09
Noise 대책  (0) 2019.01.07

+ Recent posts